【问题标题】:Making custom Yesod Form: Could not deduce (Monad (FormInput m))制作自定义 Yesod 表单:无法推断(Monad (FormInput m))
【发布时间】:2021-04-10 18:40:52
【问题描述】:

我正在尝试进行多文件表单输入。我使用Handling a collection of data in a Yesod Form 作为参考。

这里我正在尝试将字段名称关联到文件。

multiFileInput :: Monad m => RenderMessage (HandlerSite m) FormMessage =>
                  [Text] -> FormInput m [(Text, FileInfo)]
multiFileInput = mapM $ secondM (ireq fileField) . (getFieldKey &&& id)

我得到错误:

Could not deduce (Monad (FormInput m))
    arising from a use of ‘mapM’

但我不知道如何处理。如果我只是将它添加为一个约束,我必须将这个约束“(Monad(FormInput Handler))”传播到一个我不知道如何处理它的调用站点。 FormInput m 是 Monad 的一个实例,所以我不明白这个问题。

fileInfos <- runInputPost $ multiKeyFileInput "files"

-> No instance for (Monad (FormInput Handler))
    arising from a use of ‘multiKeyFileInput’

我会尝试改用 runRequestBody,但如果能理解这个问题会很好。

【问题讨论】:

  • 如果将mapM 更改为traverse 会怎样?
  • @arrowd 成功了,谢谢!我忘了 traverse 是 mapM 的应用版本,因此它对目标类型的约束较少

标签: forms haskell monads yesod


【解决方案1】:

FormInput 数据类型据说从Monad 更改为Applicative,因此您必须使用traverse,这是Applicative 版本的mapM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2018-11-21
    • 2021-04-18
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多