为什么具有记忆功能?

时间:2019-02-11 20:14:40

标签: haskell

有人可以向我解释一下为什么以下代码是备忘录吗

fib_mem :: Int -> Integer
fib_mem = (map fib [0..] !!)
where fib 0 = 1
      fib 1 = 1
      fib n = fib_mem (n-2) + fib_mem (n-1) 

2 个答案:

答案 0 :(得分:5)

我假设您是在问这如何记住fibfib本身只是一个普通函数。真正的魔力发生在fib_mem = (map fib [0..] !!)中,它可以记住fib。此表达式等效于说fib_mem x = (map fib [0..]) !! x。让我们分解一下,看看它在做什么:

  • [0..]是一个无限列表,从[0,1,2,3,..]开始并继续 ad infinitum
  • map fib [0..]fib应用于此列表的每个元素,从而生成一个列表,其中每个元素是对应于该元素索引的斐波那契数,例如8位于索引5这是重要的步骤;它通过将fib应用于每个数字来记忆!!,因此一旦强制指定索引处的值,就不必重新计算。
  • 然后Cache-Control: private Expires: Wed, 31 Dec 1969 19:00:00 EST Content-Range: instances 0-9/10 Date: Mon, 11 Feb 2019 20:17:10 GMT X-Frame-Options: SAMEORIGIN X-NBI-TIME: 4675 Content-Type: application/json Content-Length: 1400 Server: Prime 用于从列表的适当索引处取回值。

答案 1 :(得分:0)

如果您的意思是“ 为什么 记忆功能功能”,the answer is因为它是CAF (constant applicative form)has a monomorphic type