【问题标题】:Clojure: when to use memoize and when to use delay/force?Clojure:何时使用 memoize 以及何时使用延迟/强制?
【发布时间】:2020-03-19 16:05:18
【问题描述】:

我刚刚开始学习 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/delayhttps://clojuredocs.org/clojure.core/memoize 上找到解释,但找不到。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    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 的经典用例是以后需要的东西,会阻塞 或延迟启动。或者,如果您想“隐藏”顶级 defs 编译器(例如,它们会产生副作用)。

    memoize 是经典的缓存,如果计算是最好的 昂贵且输入参数集并不过分。有 clojure-verse 中的其他缓存选项,允许更好 配置(例如,它们不是未绑定的)。

    【讨论】:

    • delay 还缓存了与 memoize 不同的异常。
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2020-09-10
    • 2011-05-04
    • 2015-05-13
    • 2016-04-30
    • 2020-06-30
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多