记住一个参数

时间:2018-02-22 12:27:57

标签: clojure memoization

我有一个函数,它需要两个输入,我想记住。函数的输出仅取决于第一个输入的值,第二个输入的值对结果没有功能影响(但它可能会影响完成所需的时间)。由于我不希望第二个参数影响记忆,因此我无法使用memoize。是否有惯用的方法可以做到这一点,还是我必须自己实施备忘录?

3 个答案:

答案 0 :(得分:2)

我建议使用缓存(例如clojure.core.cache)而不是函数memoization:

(defonce result-cache
  (atom (cache/fifo-cache-factory {})))

(defn expensive-fun [n s]
  (println "Sleeping" s)
  (Thread/sleep s)
  (* n n))

(defn cached-fun [n s]
  (cache/lookup
    (swap! result-cache
           #(cache/through
              (fn [k] (expensive-fun k s))
              %
              n))
    n))

(cached-fun 111 500)
Sleeping 500
=> 12321
(cached-fun 111 600) ;; returns immediately regardless of 2nd arg
=> 12321
(cached-fun 123 600)
Sleeping 600
=> 15129

答案 1 :(得分:2)

memoize不支持仅在某些args上进行缓存,但很容易自己制作:

(defn search* [a b]
  (* a b))

(def search
  (let [mem (atom {})]
    (fn [a b]
      (or (when-let [cached (get @mem a)]
            (println "retrieved from cache")
            cached)
          (let [ret (search* a b)]
            (println "storing in cache")
            (swap! mem assoc a ret)
            ret)))))

答案 2 :(得分:0)

您可以将函数包装到另一个函数中(使用一个参数),并使用第二个默认参数将其调用为函数。然后你可以记住新功能。

(defn foo
  [param1]
  (baz param1 default-value))