如何在Clojure的地图列表中获取每个地图的键序列?

时间:2014-07-07 05:45:47

标签: map clojure key

所以我有以下尝试映射地图列表,并且我试图获取“键”函数返回的键序列,只要我将它传递给单个映射。

(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)

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

更好的是不要使用列表,除非你真的想创建一个函数调用。您的原始代码转换为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 ...)是一个函数调用。我们将内部列表更改为向量,因为这强调它是数据(而不是函数调用)。引用该列表也有效,但是不必要地复杂。它就像说"我正在进行函数调用,但不要将其作为函数调用进行评估。"