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