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@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@haskell.org
http://www.haskell.org/mailman/listinfo/beginners