Использование 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><foo></p>
,
Если вы не используете литеральные строки, вы можете явно вызватьfromString
метод:
import Lucid
import Lucid.Base
import Data.String
v = "hello"
mainPage :: Html ()
mainPage = div_ (p_ $ fromString v)