clojure按键筛选映射

clojure按键筛选映射,clojure,Clojure,我遵循这个例子: 见最后的答复 这就是我得到的神秘错误: Clojure 1.2.1 user=> (def m {:a "x" :b "y" :c "z" :d "w"}) #'user/m user=> (filter #(some % [:a :b]) m) java.lang.IllegalArgumentException: Key must be integer (user=> 我也不明白为什么这会起作用。是不是有些。。。每次都要返回第一个匹配值x吗?我在cloj

我遵循这个例子:

见最后的答复

这就是我得到的神秘错误:

Clojure 1.2.1
user=> (def m {:a "x" :b "y" :c "z" :d "w"})
#'user/m
user=> (filter #(some % [:a :b]) m)
java.lang.IllegalArgumentException: Key must be integer
(user=>
我也不明白为什么这会起作用。是不是有些。。。每次都要返回第一个匹配值x吗?我在clojure是个彻头彻尾的笨蛋,我只是想学习


请给我一些启发。

我想我只是需要更多地阅读文档:

(select-keys m [:a :b])
虽然我仍然不确定我发现的例子的意图是什么

(filter 
  (fn [x] 
    (some #{(key x)} [:a :b])) m)
使用过滤器和其他一些过滤器也可以做到这一点,但更难看、更慢


如果某个[:a:b]在集合{key x}中,即使用集合作为谓词,然后返回映射项,则从m中过滤所有内容。

如果对映射进行迭代,将获得键值对而不是键。比如说,

   user=> (map #(str %) {:a 1, :b 2, :c 3})
   ("[:a 1]" "[:b 2]" "[:c 3]")
因此,您的匿名函数尝试计算一些显然不起作用的[:ax][:a:b]


ideomatic的解决方案是使用另一个答案中提到的选择键。

您链接到的ggroup线程中的代码解决了一个不同的问题:给定一组地图和一组键,返回至少包含一个给定键的精确地图的集合。因此,在这段代码中,过滤器是用来操作一组地图,而不是单个地图;而这个特别的。。。仅当给定的映射不包含线程中提到的nil或false值时,才适合使用包含一些的块,但在任何情况下,它返回的函数将依次惰性地应用于每个给定的映射。好的,这解释了我的误解,谢谢。只是有一点吹毛求疵:你可以说map str{:a 1:b 2}这稍微有点习惯。str和str%在功能上是等效的。