我正在学习Clojure,我发现有些东西让我感到惊讶,正如标题中提到的那样。正如doc所述,clojure.set/union
函数
返回一个作为输入集合
的集合
但是我尝试输入其他类型的序列,它给了我一些结果,而不是告诉我输入类型是错误的。例如
user=> (clojure.set/union '(1 2 3) '(2 3 4))
(4 3 2 1 2 3)
在这里,我希望Clojure警告我,我的输入不是设置,但是它会返回另一个内部重复的列表,这也与文档中所述的内容相反(“返回集合”)。
我想知道为什么这个函数是这样设计的,它提供的好处莫过于给出类型错误。提前谢谢!
答案 0 :(得分:2)
虽然我更希望看到更多类型检查,但Clojure经常采用垃圾输入,垃圾输出"哲学的类型。在此示例中,它扩展为 假设 ,您为union
函数提供了2套。
(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
将较短的输入附加到较长的输入上。对于顺序列表或向量,这会将第二个项目列表(一次一个)添加到第一个列表的前面,您的示例将显示该列表。