我试图理解尾调用递归。我转换纯树递归斐波那契函数:
fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2)
至尾声版本:
fib' 0 a = a fib' 1 a = 1 + a fib' n a = fib' (n-1) (fib' (n-2) a)
[当我尝试这两个版本时,即使我尝试在第二个版本中使用
seq
强制严格评估,第二个版本似乎也比第一个树速快!
Haskell如何处理GHC内部的此类尾部呼叫?谢谢!
我试图理解尾调用递归。我将纯树递归fibonacci函数转换为:fib 0 = 0 fib 1 = 1 fib n = fib(n-1)+ fib(n-2)到尾部调用版本:fib'0 a = a fib'1 a = 1 + ...
在GHCi交互式提示符下测试的代码性能可能会产生误导,因此在对GHC代码进行基准测试时,最好在使用ghc -O2
编译的独立可执行文件中对其进行测试。添加显式类型签名并确保-Wall
不报告有关“默认”类型的任何警告也是有帮助的。否则,GHC可能会选择您不需要的默认数字类型。最后,使用criterion
基准测试库也是一个好主意,因为它可以很好地产生可靠且可重现的时序结果。