Since I realized my code was always using infinite lists, I replaced it by Data.Stream.
scan :: (a -> b -> a) -> a -> Stream b -> Stream a scan 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 a scan' 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