2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面了解有关此功能的更多信息。

0 投票
集合

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. 这与它试图表示的数学函数的定义完全相反。

我仅在我的代码中发现这个错误,因为我亲自检查了结果。我原本以为集合/并集会按正确的方式执行,当它不仅与定义相反 even and 与文档不符时,我感到非常惊讶。

0 投票

评论者:jafingerhut

Ashton,我对您的愿望表示同情,但我并没有新的论据来说服决定Clojure变化的人,认为这是一个足够好的想法。

我想指出关于您评论的回答:“甚至没有记录说明此函数期望接受集合。”我认为,从过去的评论来看,Clojure核心团队的观点是,这确实是记录的,例如,“返回一个集合,它是输入集合的并集”告诉你在将集合作为参数传递时,clojure.set/union会做什么。它对传递非集合参数时会发生什么没有说明,因此在这些情况下它可以自由地做任何事,包括目前所做的一切。

0 投票
by

评论者:jafingerhut

如果您想要一个现成的、行为相同的clojure.set函数替换品,它们除了对您提供的参数执行运行时类型检查并抛出异常之外,请考虑使用fungible库:https://github.com/jafingerhut/funjible

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