【发布时间】:2011-01-20 16:18:06
【问题描述】:
我编写了这段 sn-p 代码,我假设 len 是尾递归的,但仍然会发生堆栈溢出。怎么了?
myLength :: [a] -> Integer
myLength xs = len xs 0
where len [] l = l
len (x:xs) l = len xs (l+1)
main = print $ myLength [1..10000000]
【问题讨论】:
-
我只想指出——这是一个非常好的问题。惰性求值有一些有趣的副作用,可能并不是所有程序员都立即发现的。
-
是的,与其他非纯函数式语言相比,使用 Haskell 工作时,您会意识到重写尾递归等愚蠢的技巧通常是不必要或有害的,您应该将精力集中在真正需要的东西上进行评估。