为 Newtype 派生“ToHtml”?

Deriving `ToHtml` for 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

Foo 需要派生 ToHtml class 成为那个 class 的实例。 由于 FooStringnewtype,因此可以使用:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

我想,这段代码演示了您要查找的内容:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Lucid.Base

newtype Foo = Foo String deriving ToHtml

main = print $ toHtml (Foo "foo")