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 <abimelech@gmail.com> wrote:
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