Это новый вопрос Haskell, вероятно, связанный с монадой IO()
.
У меня есть функция в программе 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
снова исправили это.
liftIO $ readFile tmp
.` - person hammar   schedule 02.11.2012