[Haskell-beginners] Conduit composition

Ovidiu D ovidiudeac at gmail.com
Wed Apr 10 07:52:46 CEST 2013


That makes a lot of sense. Thanks!


On Wed, Apr 10, 2013 at 2:49 AM, Felipe Almeida Lessa <
felipe.lessa at gmail.com> wrote:

> 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.
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130410/6a561beb/attachment.htm>


More information about the Beginners mailing list