【发布时间】: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