clojure - Clojure:何时使用 memoize 以及何时使用延迟/强制?
问题描述
我刚刚开始学习 Clojure,并试图了解乍一看似乎非常相同的两种方法之间的区别。
(def func0 (delay (do
(println "did some work")
100)))
so.core=> (force my-delay2)
did some work
100
so.core=> (force my-delay2)
100
(defn vanilla-func [] (println "did some work") 100)
(def func1 (memoize vanilla-func))
so.core=> (func1)
did some work
100
so.core=> (func1)
100
两种方法都进行某种功能记忆。我错过了什么?
我试图在https://clojuredocs.org/clojure.core/delay和https://clojuredocs.org/clojure.core/memoize上找到解释,但找不到。
解决方案
delay
持有一个结果,你必须deref
得到结果。
memoize
是一个未绑定的缓存,它根据
输入参数缓存结果。例如
user=> (def myinc (memoize (fn [x] (println x) (inc x))))
#'user/myinc
user=> (myinc 1)
1
2
user=> (myinc 1)
2
在您的(无参数)示例中,唯一的区别是您可以直接使用结果(deref
不需要)
经典用例delay
是稍后需要的东西,这会阻止或延迟启动。或者,如果您想从编译器中“隐藏”顶级def
s(例如,它们会产生副作用)。
memoize
是一个经典的缓存,如果计算成本很高且输入参数集不过多,则最好使用它。clojure-verse 中还有其他缓存选项,允许更好的配置(例如,它们不是未绑定的)。
推荐阅读
- flutter - 迁移到空安全后的 Dart 闭包返回类型问题
- r - 如何对 R 数据框中的多对向量运行多个配对 Wilcoxon 符号秩检验?
- r - 按日期创建具有最新 NA 值的新数据框,同时按 R 中的另一列分组
- angular - 不能光滑的 ngx-光滑的轮播
- vue.js - 错误:尝试呈现获取的数据时超出最大递归更新
- java - 创建 EntityManagerFactory 时出错
- python - 为有序非重复元素的所有组合分配一个唯一整数
- flutter - Flutter:奇怪的 RangeError(索引在预期范围内)
- python - pandas:获取对应行中最大值的列名
- excel - VBA隐藏公式并保护excel中的所有工作表