
On Wed, Aug 6, 2014 at 1:46 PM, Bas van Dijk
As suggested[1] by Takano Akio a few years ago iterate can be made strict by applying headStrict to its result:
headStrict :: [a] -> [a] headStrict = foldr (\x y -> seq x (x : y)) []
The version of iterate' that I gave fuses with foldr, once unfoldr is fixed properly. The version above doesn't, with that definition of headStrict, but we can write headStrict :: [a] -> [a] headStrict xs = build $ \c n -> foldr (\x y -> seq x (x `c` y)) n xs This does indeed work well in this case, and it looks like it's probably safe to fuse in general. That seems like a reasonable approach.
We might want to add this to Data.List unless there are no use-cases for a lazy accumulator in iterate in which case I'm +1 for a strict implementation.
It's a bit hard for me to imagine why you'd need really need a lazy iterate. I believe that essentially all it does is make things like [1,2,3,undefined,undefined,...] instead of ones like 1:2:3:undefined. Since it always produces an infinite list, there's nothing much you can *do* with that spine.