这是一个可能与IO()
单子有关的 Haskell 新手问题。
我在一个Happstack.Server
程序中有一个函数可以为文件上传生成响应。
postFile = do methodM POST
decodeBody filePolicy
(tmp, name, meta) <- lookFile "upload"
ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta]
这很好用。现在,我希望它显示上传文件的内容以及它的本地临时名称、原始名称和内容类型元数据。我假设既然这一切都发生在一个do
街区里,我可以
postFile = do methodM POST
decodeBody filePolicy
(tmp, name, meta) <- lookFile "upload"
contents <- readFile tmp
ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta, "\n\n", contents]
但这给我带来了一系列错误,似乎告诉我decodeBody
电话有问题。
...
/home/inaimathi/projects/happstack-tutorial/parameters.hs:23:15:
No instance for (Happstack.Server.Internal.Monads.WebMonad
Response IO)
arising from a use of `decodeBody'
Possible fix:
add an instance declaration for
(Happstack.Server.Internal.Monads.WebMonad Response IO)
In a stmt of a 'do' block: decodeBody filePolicy
In the expression:
do { methodM POST;
decodeBody filePolicy;
(tmp, name, meta) <- lookFile "upload";
contents <- readFile tmp;
.... }
In an equation for `postFile':
postFile
= do { methodM POST;
decodeBody filePolicy;
(tmp, name, meta) <- lookFile "upload";
.... }
...
我不确定这里出了什么问题。有人可以教育我吗?
编辑3:
这将让我学会贸然下结论。
我得到的其他错误都是由于安装不正确的库造成的。清除我的~/.ghc
,然后happstack
再次安装修复它。