我有一个关于 strict 和 non-strict 定义的问题。Haskell 惰性计算的维基书(http://en.wikibooks.org/wiki/Haskell/Laziness)在“黑盒严格性分析”一节中作出以下断言:
[假设有一个只有一个参数的函数 f。] 当且仅当 f undefined 导致错误被打印并停止程序时,函数 f 是严格的。
维基将 const
与 id
进行对比,分别显示了非严格和严格函数。
我的问题是,我曾经认为 foldl 是以非严格方式评估的,会导致不良的空间泄漏,而 foldl' 则是严格的。
然而,上述测试似乎断言 foldl 和 foldl' 都是严格的。也就是说,如果它们的任何参数未定义,两个函数都会产生 undefined:
> Data.List.foldl (+) undefined [1,2,3,4]
Prelude.undefined
> Data.List.foldl' (+) 0 undefined
Prelude.undefined
> Data.List.foldl' (+) undefined [1,2,3,4]
Prelude.undefined
> Data.List.foldl (+) 0 undefined
Prelude.undefined
有人能解释一下我错过了什么吗?
谢谢!
foldl'
和foldl
的行为完全相同。 - Daniel Fischer