Hacker News new | past | comments | ask | show | jobs | submit login

Yes, that's a very peculiar feature of Haskell. I'm slightly surprised this managed to reach the front page.

In most language, you should generally prefer foldleft to foldright as foldright is not tail-recursive.




foldl' is fine an Haskell, and one of 2 endorsed by this.


Note that you need to import Data.List if you want to use foldl'

(and chances are that you will still leak memory like crazy)


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: