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)
比另一个更惯用,这两者之间有什么区别?
此外,是否可以通过嵌套两个地图获得相同的结果?
两者都可以,但第二个版本可以更好地扩展到任意嵌套级别.
嵌套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)