clojure过滤器按键映射

Kev*_*vin 9 clojure

我正在关注此示例:http://groups.google.com/group/clojure/browse_thread/thread/99b3d792b1d34b56

(见最后的回复)

这是我得到的神秘错误:

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=>
Run Code Online (Sandbox Code Playgroud)

我也不明白为什么这会起作用.是不是(某些......)每次都会返回第一个匹配值"x"?我是一个完全没人参加clojure并且只是想学习.

请赐教.

Kev*_*vin 29

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

(select-keys m [:a :b])
Run Code Online (Sandbox Code Playgroud)

虽然我仍然不确定我发现的例子意图是什么......


Joe*_*ann 8

如果您在地图上"迭代",您将获得键值对而不是键.例如,

   user=> (map #(str %) {:a 1, :b 2, :c 3})
   ("[:a 1]" "[:b 2]" "[:c 3]")
Run Code Online (Sandbox Code Playgroud)

因此,您的匿名函数会尝试评估(some [:a "x"] [:a :b])哪些明显不起作用.

意识形态的解决方案是使用select-keys另一个答案中提到的.

  • 只是一点点挑剔:你可以说(map str {:a 1:b 2}),这稍微更惯用.str和#(str%)在功能上是等价的. (5认同)