Map 如何在Clojure中获取映射列表中每个映射的键序列?

Map 如何在Clojure中获取映射列表中每个映射的键序列?,map,clojure,key,Map,Clojure,Key,下面我尝试映射一个映射列表,我试图得到键序列,每当我传递一个映射时,“keys”函数都会很好地返回 (map #(keys %) ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})) 这给了我一个惊喜 java.lang.ClassCastException:null 我假设这与键的返回类型有关,键是一个序列,通过映射,我猜它期望一个映射返回值???我真的不知道它为什么这样做,我所知道的是,如果我能让它在映射它为我做

下面我尝试映射一个映射列表,我试图得到键序列,每当我传递一个映射时,“keys”函数都会很好地返回

(map #(keys %) ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))
这给了我一个惊喜

java.lang.ClassCastException:null

我假设这与键的返回类型有关,键是一个序列,通过映射,我猜它期望一个映射返回值???我真的不知道它为什么这样做,我所知道的是,如果我能让它在映射它为我做什么时,我做一个单一的

(keys {:a-id 1 :b 3 :c 2})
这就是——(:a-id:b:c)

函数调用不是列表。应使用列表、向量或引用表达式:

(list{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})

更好的方法是不使用列表,除非您真的想创建函数调用。您的原始代码转换为包含3个贴图的向量,效果非常好:

user=> (map #(keys %) [{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}] )
((:a-id :c :b) (:e :c :d-id) (:a-id :c :d-id))
我们将外圆括号保留在适当的位置,因为(map…)是一个函数调用。我们将内部列表更改为向量,因为这强调了它是数据(与函数调用相反)。引用列表也可以,但不必要地复杂。这就像说“我正在进行函数调用,但不要将其作为函数调用进行评估。”

(map keys '({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))
user=> (map #(keys %) [{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}] )
((:a-id :c :b) (:e :c :d-id) (:a-id :c :d-id))