Dies ist eine Haskell newb Frage wahrscheinlich mit der IO()
Monade zu tun.Happstack eine Lesedatei anzeigen
Ich habe eine Funktion in einem Happstack.Server
Programm, das eine Antwort für einen Dateiupload generiert.
postFile = do methodM POST
decodeBody filePolicy
(tmp, name, meta) <- lookFile "upload"
ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta]
Das funktioniert gut. Jetzt möchte ich, dass der Inhalt der hochgeladenen Datei sowie der lokale Tempname, der ursprüngliche Name und die Metadaten des Inhaltstyps angezeigt werden. Ich war die Annahme, dass, da dies alles stattfindet, in einem do
Block ist, konnte ich nur
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]
aber das reicht mir eine Reihe von Fehlern, die mir zu sagen, scheint etwas im Busch ist mit dem decodeBody
Anruf.
...
/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";
.... }
...
Ich bin mir nicht sicher, was hier falsch läuft. Kann mir jemand etwas beibringen?
EDIT3:
Das wird lernen, mich zu voreiligen Schlüsse ziehen.
Die zusätzlichen Fehler, die ich bekam, waren alle auf falsch installierte Bibliotheken zurückzuführen. Löschen Sie meine ~/.ghc
, dann installieren Sie happstack
wieder behoben.
Ich kenne Happstack nicht, aber Sie müssen wahrscheinlich 'liftIO $ readFile tmp' verwenden. ' – hammar
Wie andere schon gesagt haben, brauchen Sie nur' liftIO '. Ich werde dem Crashkurs einen Abschnitt hinzufügen. – stepcut