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

欢迎!请参阅 关于 页面以了解更多关于这个网站的信息。

+2
集合
重新标记

嗨!

定义一个针对 map 的 filter-keys/filter-vals 函数来返回满足谓词的 map 是否有意义?

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

似乎没有在核心库中包含这些函数是有原因的。
使用核心库,我可以使用 select-keys 通过一个键的向量查询 map,并获取包含所需键的 map(如果 map 中有这些键),但没有其他更高级的 map 查询函数,除了功能强大的 reduce-kv,它会混合条件和新 map 构建。

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

有什么想法说明为什么没有类似针对 map 的函数吗?

2 个答案

+1
by
选择了 by
 
最佳回答

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

by
“修改映射”的意思是改变映射条目的数量,对吗?
我正在尝试将clojure.core中的update-keys/update-vals函数与将地图作为索引进行操作的想法对齐。这些函数变换键或值但不改变映射条目的数量(如果变换函数对其输入返回唯一值)。
by
编辑 by
这关乎的是是否需要遍历每个键值对,但`update-keys`和`update-vals`是好的相似函数。

`filter-keys/vals`意味着一个更通用的操作,它将一个变换器应用于k或v。`reduce-kv`和`transduce`都涵盖这一点,但前者不处理变换器并且没有k v参数;后者的“映射性”不被处理。也许有一个有用的`transduce-keys`和/或`transduce-vals`变体。

https://github.com/cgrand/xforms 已经对映射和 kv 函数进行了很多思考。我不确定我们是否会最终到达同一个地方,但这看起来是一个值得思考的有趣事物。
+2
by
...