[Haskell-cafe] Bug in Data.Stream?

Peter Verswyvelen bugfact at gmail.com
Sat Apr 11 18:26:37 EDT 2009


Since I realized my code was always using infinite lists, I replaced it by
Data.Stream.
However, my code stopped working.

The problem is with these functions:

scan :: (a -> b -> a) -> a -> Stream b -> Stream ascan f z (Cons x xs)
=  z <:> scan f (f z x) xs-- | @scan'@ is a strict scan.scan' :: (a ->
b -> a) -> a -> Stream b -> Stream ascan' f z (Cons x xs) =  z <:>
(scan' f $! (f z x)) xs

They are too strict I think. My code works again when I add a lazy
pattern match:

scan f z ~(Cons x xs) =  z <:> scan f (f z x) xs

scan' f z ~(Cons x xs) =  z <:> (scan' f $! (f z x)) xs

This is justified since they then behave like scanl on lists. However
it seems this package is used a lot, so maybe some code depends on
this strictness.

What to do?

PS: Why does scanl' not exist in Data.List?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090412/a1dbc70d/attachment.htm


More information about the Haskell-Cafe mailing list