-- FIXED. {- Problem with seq. Defining strict foldl as in sfoldl1 gives a bizarre result (apparently, 0+1 = 268437264) whereas the second definition gives the expected result (0+1 = 1, thankfully). Something to do with seq returning a function in the first example? Both are constructed to avoid HBC's habit of evaluating the second argument before returning it which can build up a huge heap if used in a certain way (which the obvious definition of sfoldl: sfoldl :: Eval a => (a -> b -> a) -> a -> [b] -> a sfoldl f z [] = z sfoldl f z (x:xs) = fzx `seq` sfoldl1 f fzx xs where fzx = f z x does). -} sfoldl1 :: Eval a => (a -> b -> a) -> a -> [b] -> a sfoldl1 f z [] = z sfoldl1 f z (x:xs) = (fzx `seq` sfoldl1 f fzx) xs where fzx = f z x sfoldl2 :: Eval a => (a -> b -> a) -> a -> [b] -> a sfoldl2 f z [] = z sfoldl2 f z (x:xs) = sfoldl2 f fzx (fzx `seq` xs) where fzx = f z x main = print ((sfoldl1 (+) 0 ([1]::[Int])), (sfoldl2 (+) 0 ([1]::[Int])))