9

在 Clojure 中定义自然数的惰性序列很容易:(def N (iterate inc 0)). 不出所料,如果我们要求 Clojure 使用 找到 N 的最小值(apply min N),它就会陷入无限回归。

(= 0 (min N))有没有办法在N 的数据结构中“构建”这一事实?隐含地,我们知道这一点,因为增量函数inc是严格递增的。该min函数不知道如何利用这些知识,而是试图以暴力方式找到答案。

我不知道如何以编程方式对此进行编码。我想要一种方法来构造具有附加结构(如约束和关系)的惰性序列)。我还想要一种利用这些约束来解决优化问题的方法(比如找到序列的最小值或下确界)。

有没有办法在原生 Clojure 中做到这一点?Datomic怎么样?

4

1 回答 1

6

您可以将元数据用于您拥有的特定示例。

(defn my-range
  ([] (my-range 0))
  ([n] (with-meta
         (cons n (lazy-seq (my-range (inc n))))
         {:onlyincreases true})))

(defn my-min [x] (if (:onlyincreases (meta x)) (first x) (min x)))

(my-min (my-range)) ;; => 0
(my-min (next (my-range))) ;; => 1
(my-min (nnext (my-range))) ;; => 2

如果您需要更通用的东西,您可能需要考虑创建自己的类型。

于 2013-10-20T23:25:23.050 回答