繁体   English   中英

如何在Haskell(GHC)中控制自动备忘?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM