clojure.set/difference 在结果为空且右集具有更高基数时失败

clojure.set/difference fails when result would is empty and right set has higher cardinality

我尝试从集合中删除元素,这些元素在 Clojure 中以不同的序列出现。但是 clojure.set/difference 似乎没有像我预期的那样工作。我的错误在哪里?

一些例子:

删除空序列

(difference #{3 2} '())

结果:#{3 2}(符合预期)

删除一些元素

(difference #{3 2} '(3))

结果:#{2}(符合预期)

删除集合中不存在的元素

(difference #{3 2} '(1))

结果:#{3 2}(符合预期)

删除所有元素

(difference #{3 2} '(2 3))

结果:#{}(符合预期)

删除更多存在的元素

(difference #{3 2} '(1 2 3))

我得到的结果不是 IllegalArgumentException 包含?不支持以下类型:clojure.lang.PersistentList clojure.lang.RT.contains (RT.java:814)

预期结果:#{}

所以看起来,clojure.set/difference 函数失败了,当结果是空集并且要删除的元素集的基数高于原始集时。但问题是:为什么这行不通?我希望这是 clojure.set/difference.

的合法应用

这不起作用,因为 difference 函数比较两个输入的大小并迭代较小的集合并从第一个集合中删除元素。如果第二个参数较大,它使用 contains? 来查看第一个集合中的项目是否存在于第二个集合中。 contains? 在列表上不受支持,因此您会遇到异常。

clojure.set 中的函数只能使用设置的参数调用。