有人可以向我解释一下为什么以下代码是备忘录吗
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)
答案 0 :(得分:5)
我假设您是在问这如何记住fib
。 fib
本身只是一个普通函数。真正的魔力发生在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。