使用Lucid作为简单示例

时间:2017-11-14 13:21:33

标签: html haskell haskell-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")

如何修复此编译时错误?

1 个答案:

答案 0 :(得分:3)

正如documentation中所写:

  

<强>简介

     

(..)

     

GHCi

:set -XOverloadedStrings -XExtendedDefaultRules@
import Lucid
     

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

     

(..)

因此,您需要启用OverloadedStringsExtendedDefaultRules扩展程序。

您可以通过使用进行编译来完成此操作:

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>&lt;foo&gt;</p>