3

鉴于:

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

请问我该如何解决这个编译时错误?

4

1 回答 1

4

正如文档中所写:

介绍

(..)

对于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_s ,而是类型(某种字符串)。然而,这种类型是类型类的成员,因此它可以被视为“类似字符串”的类型,并且有一个实现[源代码]StringHtmlT 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>

于 2017-11-14T13:26:32.470 回答