制作自定义 Yesod 表格:无法推断(Monad(FormInput m))

Making custom Yesod Form: Could not deduce (Monad (FormInput m))

我正在尝试进行多文件表单输入。我正在使用 作为参考。

这里我尝试做一个字段名到文件的关联列表。

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,但如果能理解问题就好了。

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