Clojure 如何将映射转换为序列?

Clojure 如何将映射转换为序列?,clojure,Clojure,回答解释如何将贴图、序列等转换为各种序列和集合,但没有说明如何将贴图转换为交替键和值序列。这里有一个方法: (apply concat {:a 1 :b 2}) => (:b 2 :a 1) 有些人可能天真地认为会产生相同的结果,但却没有,包括将映射传递到vec,vector,seq,sequence,到[],到(),以及展平。(有时尝试比仔细思考容易。) 还有什么比使用concat更简单的吗?正如@noises下面的提示,下面的答案很诱人,但却是错误的:留给其他粗心的灵魂一个警告!反例

回答解释如何将贴图、序列等转换为各种序列和集合,但没有说明如何将贴图转换为交替键和值序列。这里有一个方法:

(apply concat {:a 1 :b 2})
=> (:b 2 :a 1)
有些人可能天真地认为会产生相同的结果,但却没有,包括将映射传递到
vec
vector
seq
sequence
到[]
到()
,以及
展平
。(有时尝试比仔细思考容易。)


还有什么比使用concat更简单的吗?

正如@noises下面的提示,下面的答案很诱人,但却是错误的:留给其他粗心的灵魂一个警告!反例:

((comp flatten seq) {[1 2] [3 4], 5 [6 7]})
; (1 2 3 4 5 6 7)

(comp flant seq)
执行以下任务:

((comp flatten seq) {1 2, 3 4})
; (1 2 3 4)
但是
flatten
本身并不能:

(flatten {1 2, 3 4})
; ()
我很惊讶它不起作用,在这种情况下,它应该返回
nil
,而不是
()

没有你提到的其他人:
vec
vector
,对映射显示为序列的单个[key-value]对执行任何操作

你也可以这样做

(mapcat identity {:a 1 :b 2})


“简单”对你来说意味着什么?为什么您想要更简单的解决方案<代码>应用concat至少对我来说似乎是非常简单的解决方案。
应用concat
很好,@ymonad。我不需要更简单的解决方案。我们经常会发现,有一个Clojure函数可以做一些简单而明显的事情(在本例中,将一个映射转换为一个序列),但我们没有意识到这会产生这种效果。了解这些选项很有帮助。(我还假设,一般来说,我觉得使用
apply
,除非你有一个集合参数,它通常是一个列表的
rest
,它的
第一个
中有一个函数,在美学上,我不知道……,是令人不快的。)对于急切地转换为交替键和值的向量:
(减少为{:a 1:b 2})
flatte
几乎总是使用错误的东西,它会破坏键和值(如果它们有)的结构@noises,我同意。OP的解决方案——本质上是
(部分应用concat)
——是准确可靠的。
(mapcat seq {:a 1 :b 2})