[英]How to control automatic memoisation in Haskell (GHC)?
这是一个小程序,可打印三次前40个斐波那契数字-
module Main where
fib :: Int -> Int
fib 1 = 1
fib 2 = 1
fib n = fib (n-1) + fib (n-2)
main :: IO ()
main = run >> run >> run
where
run = mapM_ (print . fib) [1..40]
如果我用ghc Main.hs
编译它,那么“ run”的计算部分将由GHC保存,因此执行3次run
大约需要运行一次。 这真是一个惊喜! 我的印象是,单声道效果不会像这样自动记忆。
另外,如果我用ghc -O2 Main.hs
进行编译,则备忘录会丢失。 (在我的计算机上使用ghc 7.10.3时,至少是
我该如何预测什么时候要记住一些东西? 某处是否有记录在案的经验法则? 这与unsafePerformIO
之类的东西怎么玩?
run
是一个常量表达式。 因此,就像其他常数表达式一样,它只被求值一次。 哦,它编码的I / O操作被执行了 3次,但是表达式(或者更确切地说,它的子表达式)只计算一次。
我的猜测(只是一个猜测)是,不命名它可能会导致每次对其进行重新评估。 如
main = do
mapM_ (print . fib) [1..40]
mapM_ (print . fib) [1..40]
mapM_ (print . fib) [1..40]
可能会对其进行多次评估。 但是我不确定100%。
现在,如果run
是一个函数 :
main = run 40 >> run 40 >> run 40
where
run n = mapM_ (print . fibs) [1..n]
那么它可能会评估多次。 我认为GHC将避免保留这样的任意函数调用的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.