2024 Clojure状态调查中分享你的想法!

欢迎!有关如何使用本网站的更多信息,请参阅关于页面。

+1 投票
core.logic
编辑

查看conso的文档,看来映射没有被正确地视为集合

user> (coll? {:a 1}) ; Just for context
true
user> (first {:a 1})
[:a 1]
user> (run* [p q] (conso p q {:a 1})) ; This is the surprising part
()
user> (run* [p q] (conso p q [[:a 1]])) ; For comparison
([[:a 1] ()])
user> (doc conso) ; Docs talk about collection as expected input
-------------------------
clojure.core.logic/conso
([a d l])
  A relation where l is a collection, such that a is the first of l
  and d is the rest of l. If ground d must be bound to a proper tail.
nil

编辑:这对于集合也不起作用

user> (run* [p q] (conso p q #{1 3}))
()
user> (first #{1 3})
1
user> (coll? #{1 3})
true

1 个答案

+2 投票

Conso 只适用于有序集合,这就是为什么它不适用于集合和映射。没有顺序,就没有有意义的“第一个”和“剩余”概念。我同意应该通过在集合前加上“有序”来明确说明 conso 的文档。

...