
Bas van Dijk schrieb:
I don't know why the heap and stack overflow problems go away. So lets look at the core output of the latter program:
$ ghc-core -- -O2 FoldlProfile.hs
$wsum :: [Int] -> Int# $wsum = \ (w_s1rS :: [Int]) -> $wfoldl_f 0 w_s1rS
$wfoldl_f :: Int# -> [Int] -> Int# $wfoldl_f = \ (ww_s1rK :: Int#) (w_s1rM :: [Int]) -> case w_s1rM of _ { [] -> ww_s1rK; : x_aeb xs_aec -> case x_aeb of _ { I# y_aUb -> $wfoldl_f (+# ww_s1rK y_aUb) xs_aec } }
Apparently, because of the latter foldl definition, GHC is able to optimize the foldl for uboxed ints.
But why doesn't the recursive call:
$wfoldl_f (+# ww_s1rK y_aUb) xs_aec
allocate (+# ww_s1rK y_aUb) on the heap? Are unboxed values always evaluated strictly?
I think so.