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

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

+2
Clojure
编辑

也许Clojure核心可以考虑一个函数

(defn index-of [coll elt] ...)

这有助于解决目前需要编写如下代码的情况

(.indexOf something :foo)
这很丑,因为您需要了解例如PersistentVectors或其他类型的实现。

index-of函数可以为clojure.lang.Indexedjava.util.Listjava.lang.String实例工作,也许可以进一步通过协议来扩展。

我明白index-of不是在性能方面使用的理想函数,但它有其用例。

这个函数应该被推广为返回索引(懒)序列的函数,而不仅仅是第一个吗?

1 答案

0

clojure.string/index-of对于字符串情况存在。对于集合,过去已经考虑过类似的票务,但已经拒绝(https://clojure.atlassian.net/browse/CLJ-2056 是我所知道的,但我想可能还有其他)。

by
> 使用线性查找(特别是嵌套线性查找)会导致性能较差

是的,我明白这一点,但我看到人们使用 `.indexOf` 互操作方式,这让我有点烦恼,因为它依赖于内部实现。
by
为了从另一个角度看这个问题——在2010年,一名Clojure的贡献者在Google Group中回复说,

"由于其初衷是为了提升更合适的数据类型(集合、映射),所以95%的情况下 .indexOf 是用于检查元素是否在集合中(如果是一次性操作,可以使用 (some #(= item %) coll))。"
by
我的观点是标准化:我不希望在 babashka 中支持 `.indexOf`,因为它暴露了实现细节,所以最好有一个核心函数来做这件事,或者确实推荐 `some` 方法。
by
"`some` 方法"可以告诉你某个元素是否属于集合成员,但不会告诉你该元素的索引(基本上,它询问谓词返回值是否为集合中的元素,并适当地返回 true 或 nil)。但这并没有告诉你该元素在集合中的位置。有好几次,我希望在核心库中有一个覆盖所有按序集合(任何可以响应 `nth` 的)的 `index-of` 函数。我通常在需要表述统计数据类型的例程中使用它,例如,我希望说明给定的数据值代表某个百分位数。所以,排序集合,找到元素索引,然后除以元素的数量等。是的,它的时间复杂度是线性的。但这并没有阻止 `clojure.string/index-of` 函数变得有用。是的,对于已排序的数据使用二分搜索对程序来说更好。这也在核心库中很有用(仅限于向量)。
...