
On Mon, 12 Nov 2012, Bas van Dijk wrote:
On 12 November 2012 11:17, Henning Thielemann
wrote: My impression is that making 'seq' available as function without a typeclass constraint was a step in the wrong direction. Then foldl' and friends were the second step in the wrong direction and scanl' would be the third step. For 'seq' I would propose we first start with a cleanly typed 'seq' and base foldl' functions on this function instead of the built-in 'seq'.
I think I agree that putting seq in a type class would have been better (especially since we can now derive things generically). However if we are going to change this we have to change a lot of code anyway. Why not add these strict functions now and change all of them later (incl. all the strict functions in containers) when the Seq type class gets added (if that ever happens...)?
I don't think of changing it. We could provide a package that exports "the right 'seq'" and then encourage people to use this instead of Prelude.seq.
But I assume that most of the time where foldl' is used, actually a deepseq-foldl' is meant. I have often seen foldl' in Haskell library code that had not the intended effect since the accumulator was a lazy pair or a Map.
If your accumulator in foldl' is a lazy pair you should just seq the new elements before returning the pair. Not doing that is just silly. I don't see the need for deepseq there.
Silly or not, it is simple to forget it, especially if the foldl' was written once with a simple accumulator type which is later changed to a pair type.
In case your accumulator is a Map you really want to use foldl'.
Why not a deepseq foldl'?