4

「2つのループ」を必要とするシーケンスを生成する必要がある場合は、次のようなことを行う方がよいでしょう。

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

一方はもう一方より慣用的であり、これら2つの違いは何ですか?

また、2つのマップをネストすることで同じ結果を得ることができますか?

4

2 に答える 2

8

どちらでも問題ありませんが、2 番目のバージョンの方が、任意のネスト レベルに拡張できます。

ネスティング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)
于 2012-04-29T19:14:49.423 に答える
2

clojureforは「ループ」ではなく、リスト内包表記であることを忘れないでください。反復方法から前向きに考えるよりも、必要な値から後ろ向きに考える方が簡単だと思います。

値がである値のシーケンスを作成しようとしているようです

(map #(* x %) y)

  • x1 >= x > 4 =>(range 1 4)
  • y、is (range 6 9)=>(repeat (range 6 9))

しかし、あなたは理解を終わらせたいので、あなたはy与えるために微調整が必​​要です

  • y->[(range 6 9)]

最後に慣用的なリスト内包として(これは最初の例と非常に似ているので、ほとんどそこにいたことに注意してください)

(for [x (range 1 4) y [(range 6 9)]] (map #(* x %) y))
((6 7 8) (12 14 16) (18 21 24))
于 2012-04-30T08:35:54.317 に答える