Использование Lucid для простого примера

Дано:

import Lucid
import Lucid.Base

mainPage :: Html ()
mainPage = div_ (p_ "hello")

Я получаю следующую ошибку во время компиляции:

/Users/kevinmeredith/Workspace/my-project/src/Lib.hs:9:18: error:
    • Couldn't match type ‘HtmlT Data.Functor.Identity.Identity ()’
                     with ‘[Char]’
        arising from a functional dependency between:
          constraint ‘Term [Char] (HtmlT Data.Functor.Identity.Identity ())’
            arising from a use of ‘p_’
          instance ‘Term (HtmlT m a) (HtmlT m a)’ at <no location info>
    • In the first argument of ‘div_’, namely ‘(p_ "hello")’
      In the expression: div_ (p_ "hello")
      In an equation for ‘mainPage’: mainPage = div_ (p_ "hello")

Как я могу исправить эту ошибку во время компиляции, пожалуйста?

2 ответа

Как написано в документации:

вступление

(..)

За GHCi:

:set -XOverloadedStrings -XExtendedDefaultRules@
import Lucid

В модуле: {-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}

(..)

Так что вам нужно включить OverloadedStrings а также ExtendedDefaultRules расширения.

Вы можете сделать это, скомпилировав:

ghc -XOverloadedStrings -XExtendedDefaultRules file.hs

Но, возможно, более удобно включить расширения в заголовке файла:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}

import Lucid
import Lucid.Base

mainPage :: Html ()
mainPage = div_ (p_ "hello")

Как компилятор говорит в сообщении об ошибке, p_ а также div_ не ожидайте Stringс, но HtmlT Data.Functor.Identity.Identity () тип (какая-то строка). Этот тип, однако, является членом IsString класс типов, поэтому он может рассматриваться как "строковый" тип и имеет реализацию [исходный код]:

instance (Monad m,a ~ ()) => IsString (HtmlT m a) where
  fromString = toHtml

Это происходит потому, что вы можете добавить символы HTML, в этом случае (p_ "<foo>") будет выглядеть так: <p><foo></p>, Но это совершенно небезопасно. Сначала обработав его toHtmlрезультат будет <p>&lt;foo&gt;</p>,

Если вы не используете литеральные строки, вы можете явно вызватьfromStringметод:

      import Lucid
import Lucid.Base
import Data.String

v = "hello"

mainPage :: Html ()
mainPage = div_ (p_ $ fromString v)
Другие вопросы по тегам