我在 Haskell 中编写了自己的“sum”函数:

mySum [a] = a
mySum (a:as) = a + mySum as

并测试它
main = putStrLn . show $ mySum [1 .. 400000000]

仅接收堆栈溢出错误。

以相同的方式使用前奏的和:
main = putStrLn . show $ sum [1 .. 400000000]

我没有堆栈溢出。

这可能是我正在评估的庞大列表,特别是如果传递给我的函数的列表是经过严格评估的,尽管我不怀疑这一点的唯一原因是将 Prelude 的总和与相同的列表一起使用我没有得到任何错误。

最佳答案

您可能希望编译器对您的方法执行尾调用优化。不幸的是,mySum 的这个定义不是尾调用优化的。要求的是将最后一个调用的函数作为递归调用,因此在这种情况下,您希望mySum是最后一个调用的函数。但是,在您的定义中调用的最后一个函数是 (+) ,而不是 mySum 。您可以改为按照@DonStewart 的建议编写它,他在我能够之前设法输入了该解决方案。

10-08 00:34