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

欢迎!请查阅关于页面以了解更多关于此信息的工作方式。

+2
集合
重新标记

嗨!

定义一个filter-keys/filter-vals函数对map有意义吗?该函数接受一个map和一个谓词,并返回满足该谓词的map。

例如,有一个名为medley的实用库,它为数组定义了这样的函数,如filter-keysfilter-vals等。

看来在核心库中缺少它们是有原因的。
使用核心库,我可以用select-keys查询一个map,以获取一个具有请求键的map(如果map有这些键的话),但没有更复杂的查询函数,除了混合条件和新map构建的强而有力的reduce-kv。

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

为什么没有类似函数用于map,有想法吗?

2 个回答

+1

选中
 
最佳回答

通常,Clojure 中的大多数 map 函数将 map 视为一个索引,通过一些操作利用并保留基于键的 O(~1) 访问性能,而不是一个条目序列集合。提供需要全部遍历和修改映射的函数与这一理念有些矛盾。我不记得过去考虑过这些函数的包含。

您所说的“修改映射”是指改变映射条目数量,对吗?
我正在尝试将 clojure.core 中的 update-keys/update-vals 函数与将映射作为一个索引来处理的想法对齐。这些函数转换键或值,但不改变映射条目数量(如果转换函数对输入返回唯一值)。

编辑
这并不关于数量,而是否您正在遍历每个 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
by
...