假设:
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")
如何修复此编译时错误?
答案 0 :(得分:3)
正如documentation中所写:
<强>简介强>
(..)
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
类型类的成员,因此可以将其视为“类似字符串”类型,并具有实现[source code]:
instance (Monad m,a ~ ()) => IsString (HtmlT m a) where fromString = toHtml
发生这种情况的原因是因为您可以添加HTML字符,在这种情况下(p_ "<foo>")
会是这样的:<p><foo></p>
。但这是非常不安全的。首先通过toHtml
处理,结果将为<p><foo></p>
。