今日、私は高階関数の書き方がわからないという考えを持っていました。私はいくつかのまばらで怠惰な無限のシーケンスを持っています、そして私は与えられた数がこれらの怠惰なシーケンスのいずれかにあるかどうかをチェックできる抽象化を作成したいと思います。パフォーマンスを向上させるために、スパースシーケンスの値をハッシュマップ(またはセット)にプッシュし、必要に応じてハッシュマップの値の数を動的に増やしたいと思いました。怠惰なシーケンスが少ないため、自動メモ化はここでは答えではありません。
おそらくコードは最も理解しやすいので、これが私がこれまでに持っているものです。述語がクローズドオーバーハッシュマップを使用するように次のコードを変更するにはどうすればよいですか?ただし、必要に応じてハッシュマップのサイズを増やし、新しいハッシュマップを使用するように自身を再定義しますか?
(defn make-lazy-predicate [coll]
"Returns a predicate that returns true or false if a number is in
coll. Coll must be an ordered, increasing lazy seq of numbers."
(let [in-lazy-list? (fn [n coll top cache]
(if (> top n)
(not (nil? (cache n)))
(recur n (next coll) (first coll)
(conj cache (first coll)))]
(fn [n] (in-lazy-list? n coll (first coll) (sorted-set)))))
(def my-lazy-list (iterate #(+ % 100) 1))
(let [in-my-list? (make-lazy-predicate my-lazy-list)]
(doall (filter in-my-list? (range 10000))))
命令型に戻らずにこの問題を解決するにはどうすればよいですか?