处理isString实例的类型注释

时间:2014-04-28 20:31:00

标签: yesod

我知道在某些情况下我必须为某个isString实例提供类型注释,但我不完全确定我必须在哪里以及为什么这样做。

我有一个表格,我想根据following documentation

使用Bootstrap3进行渲染

在我的表单中,如果我将其保留为bootstrapSubmit "Register",我将获得以下内容:

No instance for (Data.String.IsString msg0)
  arising from the literal `"Register"'
The type variable `msg0' is ambiguous

如果我将其更改为(bootstrapSubmit ("add" :: BootstrapSubmit Text)),则会进行编译。为什么它不像文档那样对我有用?

以下是其他一些我感到困惑的例子:

bfs函数,我希望在我的表单中使用如下:

    areq intField (bfs "Weight") Nothing

让我的字段获得额外的form-control课程。与No instance for...相同的故事将其更改为areq intField (bfs ("Weight"::Text)) Nothing可修复类型问题。

为什么在没有类型注释的情况下,这对我来说不起作用?

1 个答案:

答案 0 :(得分:0)

bootstrapSubmit msgbfs msg中的消息必须是可呈现的消息,类RenderMessage的实例。

bootstrapSubmit
    :: (RenderMessage site msg, HandlerSite m ~ site, MonadHandler m)
    => BootstrapSubmit msg -> AForm m ()

bfs :: RenderMessage site msg => msg -> FieldSettings site

这可以是

  • 带有Text类型的字符串文字(代码内消息不是一个好的策略) - OverloadedStrings应该在这里工作。
  • MsgMyMessage形式的可本地化的I18 msg构造函数,其中MyMessage必须在文件messages/en.msg中有一个条目