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

欢迎!有关这个网站是如何工作的更多信息,请参阅 关于 页面。

0
错误

此代码有效

(apply clojure.set/intersection [[1 2 2] [1]])

但此操作会产生异常 "class clojure.lang.PersistentVector cannot be cast to class clojure.lang.IPersistentSet"

(apply clojure.set/intersection [[\f \o \o] [\o]])

我不明白为什么(我对 Clojure 新手,今天才开始学习)。

1 答案

+3

已选择
 
最佳答案

问题在于 clojure.set/intersection 被定义为

返回输入集合的交集

也就是说,它假定你传入的所有参数都是集合。但情况并非如此。你传入的是 向量。由于输入参数不满足函数契约的先决条件,它的行为将是不确定的。

事实上,如果第二个向量不包含在第一个向量中也存在的任何值,你的第一个版本也会抛出相同的异常。

user=> (apply set/intersection [[1 2 3] [4]])
Execution error (ClassCastException) at user/eval2082 (REPL:1). class clojure.lang.PersistentVector cannot be cast to class clojure.lang.IPersistentSet

如你所见,它只在有限的情况下(并且是偶然的)在没有使用集合作为参数时“起作用”。另一方面,使用集合则能按预期工作

user=> (apply set/intersection [#{1 2 3} #{4}])
#{}
user=> (apply set/intersection [#{1 2 3} #{1}])
#{1}
user=> (apply set/intersection [#{\f \o} #{\o}])
#{\o}
user=> (apply set/intersection [#{\f \o} #{\a}])
#{}
...