下面的两个Haskell函数似乎只是根据索引变量是隐式的还是显式的而有所不同,但性能差异是两个数量级。GHC优化
此功能需要约0.03秒来计算组播转发表30:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
此功能需要大约3秒,组播转发表30:
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
我猜它与GHC内嵌做规则,并试图添加内联/非内联编译指示以获得匹配的性能。
编辑:我理解如何对懒惰列表进行查找可用于记忆fib函数以及为什么fib的传统定义非常缓慢。我期待备忘录在第二个函数中工作,并且不理解为什么它不是。
关键是* memoization *。见[这里](http://stackoverflow.com/questions/11466284/how-is-this-fibonacci-function-memoized)。 –