Haskell,String vs ... String?

时间:2014-03-24 20:30:44

标签: haskell types happstack

我目前正在关注他们网站上的Happstack lite教程。 http://happstack.com/page/view-page-slug/9/happstack-lite-tutorial

现在,我正在实现echo函数,编译器正在给我一条我不太懂的错误消息。这是我的代码:

echo :: ServerPart Response
echo =
    path $ \(msg :: String) ->
        ok $ template "echo" $ do
            h1 "Echo service"
            p "Giant, Haskell style Papagallo"
            p msg

这是错误信息:

src/motiondude.hs:35:15:
    Couldn't match type `[Char]' with `Text.Blaze.Internal.MarkupM ()'
    Expected type: Html
      Actual type: String
    In the first argument of `p', namely `msg'
    In a stmt of a 'do' block: p msg
    In the second argument of `($)', namely
      `do { h1 "Echo service";
            p "Giant, Haskell style Papagallo";
            p msg }'

我认为这是一个引用封闭的“事物”,就像

一样
"Giant, Haskell style Papagallo"

是一个字符串。然而,根据我对编译器错误的理解,p将不接受字符串作为参数。有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:8)

问题是你似乎启用了OverloadedString扩展,这意味着

"foo" :: IsString a => a

要将普通的String强制转换为实施IsString的任何内容,只需使用fromString即可。但是,在这种情况下,Happstack的函数html看起来更合适。

答案 1 :(得分:3)

大概您已开启OverloadedStrings,文字会自动转换为Html

答案 2 :(得分:0)

如果从' msg'中删除类型注释,它是否有效?这似乎是你的问题。在第6行,字符串文字被视为Html,而不是String。但是,OverloadedStrings仅影响字符串文字,因此它不会将msg(您已经说过的字符串)隐式转换为Html。

我不是OverloadedStrings的粉丝,但这主要是因为IsString ByteString实例......它只是比Integral Word8实例困扰我,尽管它们几乎完全是同样的问题。