为什么`clojure.set / union`函数接受其他类型的数据作为输入?

时间:2018-05-04 00:11:03

标签: clojure union

我正在学习Clojure,我发现有些东西让我感到惊讶,正如标题中提到的那样。正如doc所述,clojure.set/union函数

  

返回一个作为输入集合

的集合

但是我尝试输入其他类型的序列,它给了我一些结果,而不是告诉我输入类型是错误的。例如

user=> (clojure.set/union '(1 2 3) '(2 3 4))
(4 3 2 1 2 3)

在这里,我希望Clojure警告我,我的输入不是设置,但是它会返回另一个内部重复的列表,这也与文档中所述的内容相反(“返回集合”)。

我想知道为什么这个函数是这样设计的,它提供的好处莫过于给出类型错误。提前谢谢!

1 个答案:

答案 0 :(得分:2)

虽然我更希望看到更多类型检查,但Clojure经常采用垃圾输入,垃圾输出"哲学的类型。在此示例中,它扩展为 假设 ,您为union函数提供了2套。

寻找at the source

(defn union
  "Return a set that is the union of the input sets"
  [s1 s2]
     (if (< (count s1) (count s2))
       (reduce conj s2 s1)
       (reduce conj s1 s2)))

你可以看到它只是使用conj将较短的输入附加到较长的输入上。对于顺序列表或向量,这会将第二个项目列表(一次一个)添加到第一个列表的前面,您的示例将显示该列表。