Получение `ToHtml` для Newtype?

Данный:

λ: >import Servant.HTML.Lucid

Я создал newtype:

λ: >newtype Foo = Foo String

Однако не похоже, что в области видимости есть класс типов ToHtml Foo:

λ: >instance ToHtml Foo

<interactive>:3:10: warning: [-Wmissing-methods]
    • No explicit implementation for
        ‘toHtml’ and ‘toHtmlRaw’
    • In the instance declaration for ‘ToHtml Foo’

Тем не менее один существует для String:

λ: >:t toHtml
toHtml :: (Monad m, ToHtml a) => a -> HtmlT m ()
λ: >toHtml "foo"
foo

Как я могу получить ToHtml Foo без явного определения экземпляра?


person Kevin Meredith    schedule 24.09.2017    source источник


Ответы (1)


Foo необходимо получить класс ToHtml, чтобы он был экземпляром этого класса. Поскольку Foo является newtype из String, это можно сделать с помощью:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

Я думаю, этот код демонстрирует то, что вы ищете:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Lucid.Base

newtype Foo = Foo String deriving ToHtml

main = print $ toHtml (Foo "foo")
person Igor Drozdov    schedule 24.09.2017