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

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

+2
集合
重新标记

嗨!

对map定义filter-keys和filter-vals 函数是否有意义,这些函数接受一个map和一个谓词函数并返回满足谓词的map?

例如,有一个名为medley的实用库,它为map定义了这样的函数作为 filter-keysfilter-vals 以及其他一些。

似乎没有在核心库中有这些的原因。
使用核心库,我可以使用select-keys 来查询一个map和一个键的向量,以获取包含请求键的map,但是除了强力的reduce-kv,它将条件与新的地图构建混合之外,没有更高级的查询map的函数。

Clojure集合库定义了一个set/select 函数,允许在集合上应用谓词函数并获取作为结果的集合。

为什么没有为map提供类似的函数有何想法?

2 个答复

+1

已选择
 
最佳答案

一般来说, Clojure 中大多数 map 函数将 map 视为一个索引,通过利用并保留基于键的 O(~1) 访问性能进行操作,而不是按顺序收集的一系列条目。提供需要完整遍历和修改 map 的函数与这一点有些矛盾。我不记得在过去考虑过将这些函数包含在内。

您所说的“修改 map”是指改变 map 条目的数量,对吧?
我正在尝试将与 map 一起工作的想法与 clojure.core 中的 update-keys/update-vals 函数对齐。这些函数转换键或值,但不会改变 map 条目的数量(如果转换函数对输入返回唯一值)。

编辑
这并不是关于数量,而是是否需要遍历所有的 kv 条目,但 `update-keys` 和 `update-vals` 是很好的相似函数。

`filter-keys/vals` 表明这是一个更通用的操作,它将 transducer 应用于 k 或 v。`reduce-kv` 和 `transduce` 都可以涵盖这一点,但前者不处理 transducer 并且没有 k v 参数;而后者不处理“map”的特性。因此,可能存在有用的 `transduce-keys` 和/或 `transduce-vals` 变种。

https://github.com/cgrand/xforms 已经对地图和 KV 函数进行了很多思考。我不确定我们是否会最终到达与它完全相同的地方,但这似乎是一个值得思考的有趣事项。
+2
...