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
by

集合已经是没有重复的 - 为什么还要调用 distinct?

如果你有一个函数接收一个集合,你并不一定知道它是一个集合还是向量,对吧?除非你在函数体内部测试它。
我将仅将“I propose that distinct should support sets internally.”重述为“distinct should accept any seqable coll”。
Stan 是对的,我的包裹函数接受所有集合,并且在我获取不重复的值的同时保持顺序是很重要的。我已经根据你提出的措辞 Alex 更新了我的问题,谢谢你们俩。
我想这可能是无意的,distinct 函数在城市函数中特例之外,不接受集合。distinct 的 step 函数使用解构查看集合中的第一个元素;解构使用 nth;而 nth 不支持集合。(nth 的 docstring 同样将参数称为“coll”,但列举了允许的具体类型。)

与其深入探讨只修复 distinct 的利弊,不如更深入地解决 nth 本身的问题,从而更全面地解决这个问题。迄今为止,nth 测试了几个用例,最后一个是用顺序事物的 O(n) 时间。为什么不添加一个用例来涵盖可序列化的事物呢?与 contains? 不同,nth 对暴力搜索没有异议。而且,因为 nth 是解构的工具,它不会非常粗暴(解构通常只触达前几个成员)并且好处将会很广泛。
这不是一个好主意。nth用于索引或有序集合,而集合不属于此类。更好的方法是让distinct为其输入创建序列,生成稳定的逻辑列表视图,类似于其他所有序列函数。
0
由于转换器版本正常工作,因此应该修复此问题。

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

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

是的,我们还有一些利用函数,它们接受`coll`并且预期可以在所有类型的coll上工作。
...