1

リストを考えると:

'( [:a [:a1 :a2]]  [:b [:b1 :b2 :b3]] )

リストを生成するにはどうすればよいですか:

'( [:a :a1] [:a :a1] [:b :b1] [:b :b2] [:b :b3] )

(これは、1 レベルの平坦化と組み合わせた、ある種の要素拡張デカルト積です)

私が思いつくことができる最高のものは次のとおりです。

(apply concat (map #(for [v (second %)] (vector (first %) v)) TheList))

これは非常に複雑に思えます。それを達成するためのより慣用的な方法は何ですか?

また、この種の要素展開デカルト積をリスト内で実行しようとする場合、どの関数ファミリを考慮する必要がありますか? (私はそれをどのように説明するかについて完全に途方に暮れています)。

4

2 に答える 2

3

私は次の方法でそれを行います。式を単純化するために、mapcat と一緒に破壊を使用します。

(mapcat (fn [[a b]] (map #(vector a %) b)) theList)

一般に、mapcat (または他の言語では flatmap/collect/selectmany) は、ネストされたコレクションを変換しながらフラット化したい場合に適しています。

于 2013-06-16T20:15:14.573 に答える