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

clojure.set/difference在结果为空且右集合具有更高基数时失败,clojure,set,set-theory,Clojure,Set,Set Theory,我试图从集合中删除元素,这些元素在Clojure中以不同的顺序出现。但是clojure.set/difference似乎不像我预期的那样工作。我的错误在哪里 一些例子: 删除空序列 结果:{3 2}(如预期) 删除一些元素 结果:{2}(如预期) 删除集合中不存在的元素 结果:{3 2}(如预期) 删除所有元素 结果:{}(如预期) 删除更多显示的元素 而不是我得到的结果IllegalArgumentException包含?类型clojure.lang.PersistentList clojur

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

一些例子:

删除空序列 结果:
{3 2}
(如预期)

删除一些元素 结果:
{2}
(如预期)

删除集合中不存在的元素 结果:
{3 2}
(如预期)

删除所有元素 结果:
{}
(如预期)

删除更多显示的元素 而不是我得到的结果IllegalArgumentException包含?类型clojure.lang.PersistentList clojure.lang.RT.contains(RT.java:814)不支持

预期结果:
{}


因此,
clojure.set/difference
函数似乎失败了,因为结果是空集,并且要删除的元素集的基数高于原始集。但问题是:为什么这不起作用?我希望这是
clojure.set/difference

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


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

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


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

这个答案是正确的;这正如预期的那样工作:
(difference{3 2}{1 2 3})
(difference s1 s2)
中,元素总是从
s1
中删除,无论相对基数是多少,区别在于测试
s1
中的所有元素和删除
s2
中的每个元素,或者依次提取
s2
中的每个元素并将其从
s1
中删除(如果有)。是的,谢谢。这就解决了我的问题。实际上,我的代码中真正的第二个参数不是文字,而是另一个函数的结果。但是我可以用set操作符把它转换成set;这正如预期的那样工作:
(difference{3 2}{1 2 3})
(difference s1 s2)
中,元素总是从
s1
中删除,无论相对基数是多少,区别在于测试
s1
中的所有元素和删除
s2
中的每个元素,或者依次提取
s2
中的每个元素并将其从
s1
中删除(如果有)。是的,谢谢。这就解决了我的问题。实际上,我的代码中真正的第二个参数不是文字,而是另一个函数的结果。但是我可以使用set操作符将其转换为一个集合。相关的失败案例:
(clojure.set/difference{12}[3 4 5])
计算为
{}
。在这两种情况下,使用
set
函数将非集合包装成集合可以使其正常工作。相关的失败案例:
(clojure.set/difference{1 2}[3 4 5])
计算为
{}
。在这两种情况下,使用
set
函数将非集合包装成集合可以使其正常工作。
(difference #{3 2} '())
(difference #{3 2} '(3))
(difference #{3 2} '(1))
(difference #{3 2} '(2 3))
(difference #{3 2} '(1 2 3))