Foldl 不是 Foldr,但大多数人分不清为什么
原创
你上一次因为栈溢出而抓狂,是用了 Foldl 还是 Foldr?在 Haskell 里,这两个函数看起来只是参数顺序颠了一下——但惰性求值让它们的命运完全不同。Foldl 从左往右累加,每步都欠一笔计算债,跑到最后一刻才结算;中间攒够几千步,栈就爆了。Foldr 反过来,从右往左展开,每步都把"剩下该做什么"推迟出去,反而不会爆栈,代价是永远无法遍历完无限列表。Haskell 官方博客写了篇文章把这事儿讲明白了。我的判断:写列表处理该用 Foldl'——那个带撇号的严格版本——而不是原始 Foldl。选错折叠方向,不是风格问题,是会让程序在生产环境炸掉的问题。
原文:Differences Between `Foldl` and `Foldr` · 来源:Hacker News
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123





