2014-04-28 70 views
1

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

我有一个我想与Bootstrap3渲染每following documentation

在我的表格形式,如果我只是把它作为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可修复类型问题。

为什么这不适用于没有类型注释的广告?

+0

您是否尝试过在[Bootstrap3模块(HTTP的顶部添加了'OverloadedStrings'编译,如: //hackage.haskell.org/package/yesod-form-1.3.8.2/docs/src/Yesod-Form-Bootstrap3.html)? –

+0

我只是试图添加它,但它没有帮助,同样的错误。虽然OverloadedStrings在我的项目中几乎处于活动状态,但与TemplateHaskell和各种其他扩展一样,我的印象还是很糟糕。 – rafalio

回答

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 

这可能是

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