问题在于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}])
#{}