這是一個Haskell newb問題,可能與IO()
monad有關。Happstack顯示讀取文件
我有一個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";
.... }
...
我不確定這裏發生了什麼問題。任何人都可以教育我嗎?
EDIT3:
這會學我妄下結論。
我得到的額外錯誤都是由於安裝不正確的庫。清除我的~/.ghc
,然後安裝happstack
再次修復它。
不知道Happstack,但您可能需要使用'liftIO $ readFile tmp'.' – hammar
正如其他人所說的,您只需要'liftIO'。我會在這個上添加一個部分到速成班。 – stepcut