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

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

+2
集合
重新标记

你好!

为map定义filter-keys/filter-vals函数,使它根据给定的谓词返回满足条件的map,是否合理?

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

为什么核心库中没有这些函数,似乎有它的原因。
使用核心库,我可以使用select-keys通过键的向量来查询map,如果map中有所需的键,则获取请求的键的map,但是除了强力的reduce-kv(它结合了条件和新map构建)之外,没有更高级的查询map的函数。

Clojure的集合库定义了一个set/select函数,它允许在set上应用谓词并返回一个set。

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

2 个回答

+1

已选中
 
最佳答案

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

通过“修改map”是指改变map条目的数量,对吗?
我正在尝试将map作为索引的思路与clojure.core中的update-keys/update-vals函数进行对齐。这些函数转换键或值但不改变map条目的数量(如果转换函数对其输入返回唯一值)。

编辑了
这并非关于数量,而是是否在遍历每个键值对,但`update-keys`和`update-vals`是很好的类似函数。

`filter-keys/vals`暗示了一个更通用的操作,即对k或v应用transducer。`reduce-kv`和`transduce`都涵盖了这一点,但前者不处理transducer,且它们不处理k v参数;后者不处理"map"-ness。所以可能有一个`transduce-keys`和/或`transduce-vals`变体,这将非常有用。

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