两个嵌套的for和map?

两个嵌套的for和map?,map,for-loop,clojure,idioms,Map,For Loop,Clojure,Idioms,当我需要生成一个需要“两个循环”的序列时,这样做是否更好: (for [x (range 1 4)] (map #(* x %) (range 6 9))) (for [x (range 1 4)] (for [y (range 6 9)] (* x y))) 或者像这样: (for [x (range 1 4)] (map #(* x %) (range 6 9))) (for [x (range 1 4)] (for [y (range 6 9)] (* x y))) 两者都给出了相

当我需要生成一个需要“两个循环”的序列时,这样做是否更好:

(for [x (range 1 4)] (map #(* x %) (range 6 9)))
(for [x (range 1 4)] (for [y (range 6 9)] (* x y)))
或者像这样:

(for [x (range 1 4)] (map #(* x %) (range 6 9)))
(for [x (range 1 4)] (for [y (range 6 9)] (* x y)))
两者都给出了相同的结果:

((6 7 8) (12 14 16) (18 21 24))
一种语言比另一种语言更地道吗?这两种语言的区别是什么


另外,嵌套两个贴图是否可能得到相同的结果?

两者都可以,但第二个版本可以更好地扩展到任意嵌套级别

嵌套
map
调用也有效:

user=> (map (fn [x] (map (fn [y] (* x y)) (range 6 9))) (range 1 4))
((6 7 8) (12 14 16) (18 21 24))
但是,不能嵌套快捷方式函数语法

顺便说一句,如果您确实需要更多的集合理解,比如语义,
for
也内置了嵌套。结果有些不同:

user=> (for [x (range 1 4), y (range 6 9)] (* x y))
(6 7 8 12 14 16 18 21 24)

记住,clojure不是一个“循环”,它是一个列表理解。我发现从所需值向后思考比从迭代方式向前思考更容易

似乎您正在尝试创建一个值序列,其中的值是

(map#(*x%)y)

  • x
    1>=x>4
    =>
    (范围14)
  • y
    ,是
    (范围69)
    =>
    (重复(范围69))
但既然你想终止理解,你就需要调整一下
y
giving

  • y
    ->
    [(范围6-9)]
最后,作为惯用列表理解(注意,这与您的第一个示例非常相似,所以您几乎就到了)


+1... 关于内置嵌套:我确实在做两个嵌套循环,然后进行展平以获得单个序列(而不是序列)。我现在明白了:我试图通过使用#(…)快捷方式嵌套两张地图,因此一事无成!