memoize时的部分vs函数文字

时间:2014-01-05 08:19:40

标签: clojure memoization

这给了我一些大脑重击:

user> (repeatedly 10 #((memoize rand-int) 10))
(7 0 4 8 1 2 2 1 6 9)
user> (repeatedly 10 (partial (memoize rand-int) 10))
(8 8 8 8 8 8 8 8 8 8)

我想知道原因是否因为函数文字(第一版)每次被调用/评估,因此memoize每次都被“重新创建”(重新记忆),因此不是真的有任何真正有意义的“记忆”,而第二个partial实际上返回一个只评估一次的固定函数,因此每次使用相同的memoize值(排序)虽然我不认为这有资格作为一个真正的“封闭”)

我是否正确思考?

1 个答案:

答案 0 :(得分:5)

是的,memoize不会以任何方式修改其论点,所以

#((memoize rand-int) 10)

在每次调用时重新创建memoized函数。

(fn [] ((memoize rand-int) 10))

等同。

要从另一个函数调用memoized函数,您需要将它放在Var或封闭的本地函数中:

(repeatedly 10 (let [r (memoize rand-int)] #(r 10)))
;= (2 2 2 2 2 2 2 2 2 2)

partial示例中,(memoize rand-int)返回的函数作为参数传递给函数partial,然后函数返回一个闭包,该闭包在{{1}的返回时关闭}。所以,这与上面的示例非常接近((memoize rand-int)返回的闭包使用partial来调用memoized函数)。