[Haskell-beginners] Conduit composition

Felipe Almeida Lessa felipe.lessa at gmail.com
Wed Apr 10 01:49:53 CEST 2013


Complementing David McBride's answer, what misled you is probably the
precedence of the operators.  Your original expression is the same as:

  main =
    (((Conduit.sourceList [1..14]
    $= Conduit.map show)
    $= Conduit.iterM putStrLn)
    $= Conduit.iterM putStrLn)
    $$ Conduit.sinkNull

Cheers,

On Tue, Apr 9, 2013 at 7:54 PM, David McBride <toad3k at gmail.com> wrote:
> The reason is because the operator $= puts together a source and a conduit
> and returns a new source.
>
> The operator =$= is used to combine two conduits into another conduit.
>
> With $= if you try to put two conduits together, the underlying types just
> won't match up.  They don't match up specifically to tell you that you are
> not quite doing it correctly.  It is trying to match the first argument to a
> source, which has its input type restricted to ().  Since you have a string
> there, then it complains.
>
> So try display = CL.iterM putStrLn =$= CL.iterM putStrLn  which does exactly
> what you were looking for.
>
>
> On Tue, Apr 9, 2013 at 6:34 PM, Ovidiu D <ovidiudeac at gmail.com> wrote:
>>
>> Given the following works as expected (i.e. prints the value twice):
>>
>> main =
>>     Conduit.sourceList [1..14]
>>     $= Conduit.map show
>>     $= Conduit.iterM putStrLn
>>     $= Conduit.iterM putStrLn
>>     $$ Conduit.sinkNull
>>
>> I would expect the following to work as well:
>> main =
>>     Conduit.sourceList [1..14]
>>     $= Conduit.map show
>>     $= display
>>     $$ Conduit.sinkNull
>>
>> display = Conduit.iterM putStrLn $= Conduit.iterM putStrLn
>>
>> ...but I get the compilation error:
>> Couldn't match expected type `String' with actual type `()'
>>     Expected type: Conduit.Conduit String m0 a0
>>       Actual type: Conduit.Source IO ()
>>     In the second argument of `($=)', namely `display'
>>     In the first argument of `($$)', namely
>>       `Conduit.sourceList [1 .. 14] $= Conduit.map show $= display'
>>
>> I don't understand why the type of display is inferred to a
>> Conduit.Source. Can somebody please explain?
>>
>> What I want is to have readable names for certain segments in my pipe. Is
>> that possible?
>>
>> Thanks,
>> ovidiu
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>



-- 
Felipe.



More information about the Beginners mailing list