gpt4 book ai didi

clojure - 内存时的部分与函数文字

转载 作者:行者123 更新时间:2023-12-04 19:07:28 27 4
gpt4 key购买 nike

这让我有点脑洞:

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 的值相同因此每次都使用(有点像闭包,尽管我认为这不符合真正的“闭包”)

我的想法正确吗?

最佳答案

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

#((memoize rand-int) 10)

在每次调用时重新创建内存函数。
(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 ,然后返回一个闭包,该闭包在 (memoize rand-int) 的返回上关闭.因此,这与上面的示例非常接近(除了 partial 返回的闭包使用 apply 调用 memoized 函数)。

关于clojure - 内存时的部分与函数文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com