两个嵌套的for和map?

Ced*_*tin 4 for-loop idiomatic clojure map

当我需要生成一个需要"两个循环"的序列时,最好是这样做:

(for [x (range 1 4)] (map #(* x %) (range 6 9)))
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

(for [x (range 1 4)] (for [y (range 6 9)] (* x y)))
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果:

((6 7 8) (12 14 16) (18 21 24))
Run Code Online (Sandbox Code Playgroud)

比另一个更惯用,这两者之间有什么区别?

此外,是否可以通过嵌套两个地图获得相同的结果?

Mat*_*ard 8

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

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

但是,您无法嵌套快捷函数语法.

顺便说一下,如果你真的需要更多类似于集合理解的语义,那么for内置嵌套也是如此.结果有些不同:

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