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

欢迎!请参阅 关于 页面以获取更多关于此如何运作的信息。

+11
序列
重新标记

我惊讶地发现 distinct 在集合上调用时会抛出异常,例如:
(distinct #{1 2 3})

一种解决方案是首先在集合上调用 seq(distinct (seq #{1 2 3}))

然而,当考虑到其他序列操作符(例如 mapkeepreducefirstsome 等)都可以接受集合时,这似乎是不必要的仪式。

此外,distinct 的文档字符串声明:
> 返回一个惰性序列,其中包含 coll 中重复元素。

由于 (coll? #{1 2 3}) => true,这对用户来说很困惑。

关于数学组合学中的出现已有一些相关讨论 在这里在这里,但没有任何真正的决定。

我提议 distinct 应接受任何可序列化的集合。

2 个回答

+2

集合本身已经是唯一的 - 为什么还要在它们上面调用 distinct 呢?

如果你有一个接受集合作为参数的函数,你不一定知道它接受的是一个集合还是向量,对吧?除非你在函数体内对其进行测试。
我将“我建议distinct应能在内部支持集合”重新表述为“distinct应接受任何可迭代的集合”。
Stan是对的,我的包含函数接受所有集合,同时保留顺序获取不同值很重要。我根据你提出的措辞Alex更新了我的问题,谢谢你们。
我想distinct函数在序列函数中非常特别,它不接受集合。distinct的步函数使用解构来查看集合中的第一个元素;解构使用nth;而nth不能与集合一起使用。(nth的文档字符串同样称参数为"coll",但也列举了允许的具体类型。)

与其深入思考仅修复distinct的好处和坏处,不如在nth本身中进行更深入的思考,以解决这个古怪的问题。已经,nth测试了几个情况,最后一个是顺序事物的O(n)时间。为什么不给它添加另一个情况以覆盖可序列化的事物?与contains?不同,nth并不介意使用暴力。由于nth是解构的工具,它不会非常暴力(解构通常只获取少数几个第一个成员),并且好处将是广泛的。
这并非一个好主意。nth 用于带索引或有序的集合,而集合不在此列。更好的答案是让 distinct 对输入进行序列化,生成一个稳定的逻辑视图列表,类似于所有其他序列函数。
0
应该修复,因为转换器版本运行良好,因此行为不同。

```
(into [] (distinct) #{:a :b})
=> [:b :a]
```

常规的 distinct 实现选择了使用解构,这需要 nth。

是的,我们也有一些实用函数,它们接受 `coll` 并被期望在所有类型的 coll 上工作。
...