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

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

+11
序列
重标记

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

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

但是,这似乎是一种不必要的仪式,因为我所想到的其他序列运算符(例如 map、keep、reduce、first、some 等)都接受集合。

此外,distinct 的文档字符串声明
> 返回一个无限序列,其中包含去除重复项的 coll 的元素。

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

关于这一点,已经在 math.combinatorics 有关其出现的讨论进行了讨论 这里这里,但没有真正的决定。

我建议 distinct 应该接受任何可序列化的 coll。

2 个回答

+2

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

如果你有一个接受集合的函数,你并不一定知道它是一个集合还是向量,对吧?除非你在函数体内部对它进行测试。
我只是将“I propose that distinct should support sets internally.”改写成“distinct should accept any seqable coll”。
Stan是正确的,我的封装函数接受所有集合,并且在我保持有序的同时获取不同的值是很重要的。我已经用你提出的说法Alex更新了我的问题,谢谢你们。
我想这可能是一个意外的疏忽,因为distinct在序列函数中特别不接收集合。distinct的步函数使用解构来查看集合的第一个项目;解构使用nth;而nth不能与集合一起使用。(nth的文档字符串同样将参数称为"coll",但列出了允许的具体类型。)

与其深入思考仅仅修复distinct的好处和坏处,我们可以在nth自身中更深入地解决这个问题,从而解决这个奇怪的问题。既然nth已经测试了几种情况,最后一种是序列事物的O(n)时间。为什么不一起新增一个情况来覆盖序列化事物呢?与contains?不同,nth没有任何对暴力搜索的顾虑。此外,由于nth是解构的工具,这不会非常粗暴(解构通常只获取前几个成员)并且将会有广泛的好处。
这不是一个好主意。nth 用于索引或有序集合,而集合不是。更好的答案是将 distinct 的输入转换为序列,生成集合的逻辑列表视图,类似于所有其他序列函数。
0 投票
应该修复这个问题,因为 transducer 版本运行良好,并且表现不同。

```

This is not a good idea. nth is for indexed or ordered colls, and sets are neither. A better answer is for distinct to seq it’s input, producing a stable logical list view of a set, similar to all the other sequence functions.
```

0 votes

by
...