Upgrading from WAI 1.4.1 to 2.0.0, Monad / ResourceT issues

Trying to upgrade this code from WAI 1.4.1 to 2.0.0. On one hand, I don't have to liftIO the IO action on line 23 anymore. On the other, this line that writes the request body to a file seems to be giving me some trouble now: https://github.com/LeifW/online-typechecker/blob/master/index.hs#L22 No instance for (MonadResource IO) arising from a use of `sinkFile' Possible fix: add an instance declaration for (MonadResource IO) In the second argument of `($$)', namely `sinkFile ("sources" > fromText name)' In a stmt of a 'do' block: requestBody req $$ sinkFile ("sources" > fromText name) If I put a "runResouceT" in front of that, like "runResourceT $ requestBody req $$ sinkFile ("sources" > fromText name)", I get Couldn't match type `IO' with `ResourceT IO' Expected type: Data.Conduit.Internal.Source (ResourceT IO) Data.ByteString.Internal.ByteString Actual type: Data.Conduit.Internal.Source IO Data.ByteString.Internal.ByteString In the return type of a call of `requestBody' In the first argument of `($$)', namely `requestBody req' In the second argument of `($)', namely `requestBody req $$ sinkFile ("sources" > fromText name)' Any pointers?

There are two different approaches you could use:
1. Modify the source so that its base monad is ResourceT IO. You can do
that using hoist, e.g.:
let newSource = hoist lift (requestBody req)
2. In a situation like this, you don't really need ResourceT at all.
Instead, using withFile and sinkHandle would be sufficient:
withFile ("source" > fromText name) WriteMode $ \h ->
requestBody req $$ sinkHandle h
I'd recommend going for (2), as IMO it's a little bit clearer what's going
on, and is slightly more efficient.
Michael
On Sun, Dec 8, 2013 at 9:44 PM, Leif Warner
Trying to upgrade this code from WAI 1.4.1 to 2.0.0. On one hand, I don't have to liftIO the IO action on line 23 anymore. On the other, this line that writes the request body to a file seems to be giving me some trouble now: https://github.com/LeifW/online-typechecker/blob/master/index.hs#L22
No instance for (MonadResource IO) arising from a use of `sinkFile' Possible fix: add an instance declaration for (MonadResource IO) In the second argument of `($$)', namely `sinkFile ("sources" > fromText name)' In a stmt of a 'do' block: requestBody req $$ sinkFile ("sources" > fromText name)
If I put a "runResouceT" in front of that, like "runResourceT $ requestBody req $$ sinkFile ("sources" > fromText name)", I get
Couldn't match type `IO' with `ResourceT IO' Expected type: Data.Conduit.Internal.Source (ResourceT IO) Data.ByteString.Internal.ByteString Actual type: Data.Conduit.Internal.Source IO Data.ByteString.Internal.ByteString In the return type of a call of `requestBody' In the first argument of `($$)', namely `requestBody req' In the second argument of `($)', namely `requestBody req $$ sinkFile ("sources" > fromText name)'
Any pointers?
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
participants (2)
-
Leif Warner
-
Michael Snoyman