请在 2024 Clojure 现状调查! 分享您的想法。

欢迎!请参阅 关于 页面以获取更多有关该功能的信息。

0
Collections

clojure.set/union 对输入类型非常敏感。它不会尝试检查或修正输入类型,不会引发错误,甚至不会对此行为进行文档记录。

如果所有输入都是集合,则它可以正常工作。

`
ti.repl-init=> (clojure.set/union #{1 2 3} #{1 2 3 4})

{1 4 3 2}

`

如果参数都是向量或序列,则返回相同类型的表示,并包含重复项。

ti.repl-init=> (clojure.set/union [1 2 3] [1 2 3]) [1 2 3 1 2 3] ti.repl-init=> (clojure.set/union (list 1 2 3) (list 1 2 3)) (3 2 1 1 2 3)

如果参数是混合的,只有当最长的输入参数是集合时,才会返回正确的结果。

`
ti.repl-init=> (clojure.set/union #{1 2 3} [2 3])

{1 3 2}

ti.repl-init=> (clojure.set/union [1 2 3] #{2 3})
[1 2 3 3 2]
ti.repl-init=> (clojure.set/union [2 3] #{1 2 3})

{1 3 2}

ti.repl-init=> (clojure.set/union #{2 3} [1 2 3])
[1 2 3 3 2]
`

5 答案

0

评论由:alexmiller 发表

此问题已被多次提出。请参阅 CLJ-1682,CLJ-810。

0

评论由:ashtonkemerling 发表

我没有在你的提到的票据中看到 set/union。

此外,这个问题在几个重要的方面与交集的错误不同

  1. 它静默地返回错误类型的数据,并且包含错误值。
  2. 它永远不会引发异常。

但是,它与交集问题共享以下错误

  1. 此行为不仅依赖于类型,还依赖于数据。它将根据给定集合的长度而正常工作。
  2. 甚至没有文档说明这个函数期望接收集合。
  3. 它与它试图表示的数学函数的定义恰好相反。

我只是在检查结果时发现了这个错误。我本来以为集合/并集会做正确的事,但当它既不符合定义也不符合文档时,我感到非常惊讶。

0

评论者:jafingerhut

阿什顿,我对你想要得到的有所同情,但我没有新的论点可能会说服那些决定对Clojure进行修改的人,认为这样做是个好主意。

我想指出你对其中一个评论的回答:“甚至没有文档说明这个函数期望接收集合。”在我看来,从过去的评论中可以看出,Clojure核心团队的观点是这确实是文档过的,例如,“返回一个集合,它是输入集合的并集”告诉你在给这个函数传递集合作为参数时,clojure.set/union做什么。它对当你传递非集合参数时它做什么没有任何说明,所以在这些情况下它可以自由地做任何事情,包括它现在正在做的事情。

0

评论者:jafingerhut

如果您需要一个与clojure.set函数兼容的现成替代品,除了它们对您提供的参数执行运行时类型检查,并在类型错误时抛出异常外,例如不适用于并集、交集、差集、子集?和超集?的集合,请考虑使用可互换库:https://github.com/jafingerhut/funjible

0
参考: https://clojure.atlassian.net/browse/CLJ-1953(由alex+import报告)
...