我使用haskell的一个最大问题是能够(正确地)预测haskell代码的性能。虽然我遇到了一些更难的问题,但我发现自己几乎没有理解。
采取这样简单的事情:
count [] = 0
count (x:xs) = 1 + count xs
据我所知,这并不是严格意义上的尾调用(它应该在堆栈上保持1),所以看看这个定义 - 我能解释什么呢?计数函数显然应该有O(1)空间要求,但是这个是吗?我能保证它会不会或不会?
答案 0 :(得分:6)
如果您想更容易推理递归函数,请使用具有已知时间和空间复杂度的高阶函数。如果您使用foldl或foldr,您就会知道它们的空间复杂度不能为O(1)。但是如果你在
中使用来自Data.List的foldl'count = foldl' (\acc x -> acc + 1) 0
你的函数在空间复杂度上将是O(1),因为foldl'是每个定义的尾递归。
HTH Chris