joh*_*ers 5 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)
Run Code Online (Sandbox Code Playgroud)
我想知道这是因为每次调用/评估函数文字(第一版),因此每次memoize都"重新创建"(重新记忆),因此没有真正有意义的"记忆" partial实际上,第二个实际上是返回一个只被评估一次的固定函数,memoize因此每次都使用相同的值(有点类似于闭包,但我不认为这有资格作为真正的"闭包") )
我在想什么?
是的,memoize不会以任何方式修改其论点,所以
#((memoize rand-int) 10)
Run Code Online (Sandbox Code Playgroud)
在每次调用时重新创建memoized函数.
(fn [] ((memoize rand-int) 10))
Run Code Online (Sandbox Code Playgroud)
是等价的.
要从另一个函数调用memoized函数,您需要将它放在Var或封闭的本地:
(repeatedly 10 (let [r (memoize rand-int)] #(r 10)))
;= (2 2 2 2 2 2 2 2 2 2)
Run Code Online (Sandbox Code Playgroud)
在这个partial例子中,返回的函数(memoize rand-int)作为参数传递给函数partial,然后函数返回一个闭包,它关闭返回(memoize rand-int).所以,这是非常接近上面的例子中(除返回关闭partial使用apply调用memoized功能).