Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Out of curiosity, what causes foldl' to leak memory in most cases? I generally use it out of habit if I know I will consume the entire list and don't have a good reason to use foldr, so it would be nice to know if I'm shooting myself in the foot.


Foldl' doesn't leak, but it sure looks like it does, if you think the folded function is strict in the accumulator argument, but isn't. For example, this attempt at computing the average of a list

  uncurry (/) . foldl' (\(s,l) x -> (s+x,l+1)) (0,0)
leaks, because during the recursion, there is no reason to scrutinize the intermediate pairs. This version is fine:

  uncurry (/) . foldl' (\(!s,!l) x -> (s+x,l+1)) (0,0)


{-# LANGUAGE Strict, StrictData, BangPatterns #-} should imply the !, right?


I don't think it does. 'Strict' doesn't add an implicit ! to nested patterns (so (s,l) becomes !(s,l), not (!s,!l)), and 'StrictData' doesn't change anything about the tuple, which comes from a different module. (Disclaimer: I haven't actually used 'Strict', this is my interpretation of the user guide.)


Thanks, this is a helpful example :)




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: