Haskell, String vs ...String?



我目前正在他们的网站上学习Happstack生活教程。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将不接受字符串作为参数。有人能给我解释一下吗?

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

"foo" :: IsString a => a

要将普通的旧String强制到实现IsString的任何东西上,只需使用fromString。然而,在这种情况下,Happstack有一个函数html看起来更合适。

假设您打开了OverloadedStrings,并且文字将自动转换为Html

如果您从'msg'中删除类型注释,它是否有效?这似乎是你的问题。在第6行,字符串字面值被视为Html,而不是string。然而,overloaddstrings只影响字符串字面量,因此它不会隐式地将msg(您已经说过是一个string)转换为Html。

我不是重载字符串的粉丝,但这主要是因为IsString ByteString实例…它比integratedword8实例更让我烦恼,尽管它们有几乎完全相同的问题。

相关内容

  • 没有找到相关文章

最新更新