我如何帮助 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 是最小的自然数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 next.jdbc 将 SQLite 中的 bool 列读入 bool Clojure 值? SQLite 将布尔值存储为 0/1