给定:
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")
我该如何修复这个编译时错误?
正如文档中所写:
简介
(..)
对于
GHCi
::set -XOverloadedStrings -XExtendedDefaultRules@ import Lucid
在模块中:
{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}
(..)
因此需要打开OverloadedStrings
和ExtendedDefaultRules
扩展。
您可以通过编译:来实现这一点
ghc-XOverloadedStrings -XExtendedDefaultRulesfile.hs
但也许更方便的是打开文件头中的扩展名:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
import Lucid
import Lucid.Base
mainPage :: Html ()
mainPage = div_ (p_ "hello")
就像编译器在错误消息中所说的那样,p_
和div_
不是期望String
s,而是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)