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}])
#{}
...