使用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")

我该如何修复这个编译时错误?

正如文档中所写:

简介

(..)

对于GHCi:

:set -XOverloadedStrings -XExtendedDefaultRules@
import Lucid

在模块中:{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}

(..)

因此需要打开OverloadedStringsExtendedDefaultRules扩展。

您可以通过编译:来实现这一点

ghc-XOverloadedStrings -XExtendedDefaultRulesfile.hs

但也许更方便的是打开文件头中的扩展名

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
import Lucid
import Lucid.Base
mainPage :: Html ()
mainPage = div_ (p_ "hello")

就像编译器在错误消息中所说的那样,p_div_不是期望Strings,而是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)

相关内容

  • 没有找到相关文章

最新更新