At Mon, 4 Jul 2011 20:36:33 +1000,
John Ky wrote:
> 
> Hi Haskell Cafe,
> 
>           enum |$ inumLines .| inumReverse .| inumUnlines .| iter
> ...
>    
>     iterLines :: (Monad m) => Iter L.ByteString m [L.ByteString]
>     iterLines = do
>       line <- lineI
>       return [line]
>    
>     iterUnlines :: (Monad m) => Iter [L.ByteString] m L.ByteString
>     iterUnlines = (L.concat . (++ [C.pack "\n"])) `liftM` dataI
>    
>     iterReverse :: (Monad m) => Iter [L.ByteString] m [L.ByteString]
>     iterReverse = do
>       lines <- dataI
>       return (map L.reverse lines)
>    
>     inumLines = mkInum iterLines
>     inumUnlines = mkInum iterUnlines
>     inumReverse = mkInum iterReverse
> 
> It all works fine.
> 
> My question is: Is it possible to rewrite inumReverse to be this:
> 
>     iterReverse :: (Monad m) => Iter L.ByteString m L.ByteString
>     iterReverse = do
>       line <- dataI
>       return (L.reverse line)
>    
>     inumReverse = mkInum iterReverse
> 
> And still be able to use it in the line:
> 
>     enum |$ inumLines .| {-- inumReverse goes in here somehow --} .|
>     inumUnlines .| iter
> 
> The reason I ask is that the Haskell function reverse has the type [a] -> [a],
> not  [[a]] -> [[a]].
> 
> I thought perhaps the alternative inumReverse is cleaner than the original as
> it behaves more similarly to Haskell's own reverse function.

I'm not sure what you are trying to achieve.  If you want an iter that
works on L.ByteStrings, then you can say:

     iterReverse :: (Monad m) => Iter L.ByteString m L.ByteString
     iterReverse = do
       line <- lineI
       return (L.reverse line)
    
In that case you don't need inumLines and inumUnlines.  If, however,
you want the type to be [L.ByteString], and you would rather do this
one line at a time, instead of calling map, then you could do
something like the following:

     iterReverse :: (Monad m) => Iter [L.ByteString] m [L.ByteString]
     iterReverse = do
       line <- headI
       return [L.reverse line]

But the code you have above should also work, so it all depends on
what you are trying to achieve.

David

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to