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

欢迎!有关这方面的一些更多信息,请参阅关于页面。

+2
集合
重新标记

嗨!

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

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

看起来缺少这种函数的理由。
使用core库,我可以使用select-keys查询一个map,并使用一个键向量来获取具有所需键的map(如果map中有这些键),但没有其他更高级的map查询功能,除了功能强大的reduce-kv函数,它将条件和新map构建混合在一起。

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

有什么想法可以解释为什么没有类似函数为map提供支持吗?

2 个答案

+1

被选中
 
最佳答案

总的来说,大多数Clojure的映射函数将映射作为索引来处理,通过利用和保留基于键的O(~1)访问性能进行操作,而不是将映射作为条目序列的集合。提供需要完整遍历和修改映射的函数与这种处理方法略有矛盾。我不记得过去考虑过包括这些函数。

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

编辑了
这不仅仅关于条目数量,而是关于你是否要遍历每一个键值对,而`update-keys`和`update-vals`是两个很好的类似函数。

`filter-keys/vals`暗示了一种更通用的操作,应用转换器到键或值上。`reduce-kv`和`transduce`都大致覆盖了这个,但前者不处理转换器,且它们没有k v参数;后者不处理“映射”。所以可能存在一个`transduce-keys`和/或`transduce-vals`的变体,这将是有用的。

https://github.com/cgrand/xforms 已经有很多关于这方面的思考,特别是关于映射和键值函数。我不确定我们是否会得出完全相同的地方,但这似乎是一个值得关注的问题。
+2

...