我如何帮助 Clojure 理解 0 是最小的自然数?

Posted

技术标签:

【中文标题】我如何帮助 Clojure 理解 0 是最小的自然数?【英文标题】:How can I help Clojure understand that 0 is the smallest natural number? 【发布时间】:2013-10-29 07:06:36 【问题描述】:

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

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

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

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

【问题讨论】:

Datomic 在哪里适合?你想存储那个额外的约束吗? 【参考方案1】:

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

(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

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

【讨论】:

以上是关于我如何帮助 Clojure 理解 0 是最小的自然数?的主要内容,如果未能解决你的问题,请参考以下文章

对 Clojure 中的“let”感到困惑

在 Clojure 中将嵌套向量减少为另一个向量

如何使用 next.jdbc 将 SQLite 中的 bool 列读入 bool Clojure 值? SQLite 将布尔值存储为 0/1

理解Clojure STM 软件事务性内存

如何使承诺因clojure中的错误而失败?

如何在 Clojure 中对函数进行基准测试?