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

欢迎!请查看 关于 页面以了解该系统的工作方式。

+11
序列
重新标记

令我惊讶的是,distinct 在对一个集合进行调用时会抛出异常,例如:
(distinct #{1 2 3})

一个解决方法是在集合上先调用 seq,例如:(distinct (seq #{1 2 3}))

然而,这似乎是一种不必要的仪式,因为我想到的每个其他序列运算符(如 mapkeepreducefirstsome 等)都可以接受集合。

此外,distinct 的文档字符串说明了
>> 返回一个不包含重复元素的集合的惰性序列。

由于 (coll? #{1 2 3}) => true,这使用户难以理解。

有关这个主题的一些讨论可以在这里找到,与其在 math.combinatorics 中的出现相关 这里这里,但没有做出任何真正的决定。

我建议 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 实现选择了使用 destructuring,这需要 nth。

是的,我们也提供一些利用函数,接受 `coll` 并期望能够在所有类型的 coll 上工作。
...