[Haskell-cafe] Guide for converting existing code to Conduit 0.4?

Michael Snoyman michael at snoyman.com
Mon Apr 9 13:34:16 CEST 2012


On Mon, Apr 9, 2012 at 2:27 PM, Erik de Castro Lopo
<mle+hs at mega-nerd.com> wrote:
> Michael Snoyman wrote:
>
>> Hmm... I'd be surprised if you really need the Pipe signature that
>> you're providing.
>
> I'm not providing it, the compiler is suggesting it:
>
>    Network/HTTP/Proxy.hs:835:47:
>        Couldn't match expected type `ByteString' with actual type `()'
>        Expected type: C.Pipe Void ByteString (ResourceT IO) ByteString
>          Actual type: C.Source (ResourceT IO) ByteString
>        In the return type of a call of `requestBody'
>        In the second argument of `($)', namely `requestBody req'
>
> For the code:
>
>    HC.requestBody = HC.RequestBodySource contentLength
>                         $ fmap copyByteString
>                         $ Wai.requestBody req
>
> but the type of the RequestBodySource constructor and Wai.requestBody
> hasn't changed.
>
> Erik
> --
> ----------------------------------------------------------------------
> Erik de Castro Lopo
> http://www.mega-nerd.com/
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

It's caused by fmap. This is one of the downsides with the move to a
single type: some of the instances don't make sense anymore. In
particular, Functor will allow you to map the *result* type, not the
*output* type. I think I'll add a helper function- mapOutput- to the
next version of conduit. Meanwhile, you can use:

    Wai.requestBody req $= Data.Conduit.List.map copyByteString

Michael



More information about the Haskell-Cafe mailing list