[英]Clojure functions that yield “internal cartesian products” in a collection
給定列表:
'( [: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))
這似乎過於復雜; 有什么更慣用的方式來實現它?
另外,在嘗試執行列表內的這種元素擴展笛卡爾積乘積時,應該考慮哪些函數系列? (我完全無法描述它)。
另一個:
(for [[x inner-xs] theList
inner-x inner-xs]
[x inner-x])
for
嵌套集合和平坦結果非常有用。
我將以以下方式進行操作。 它結合使用分解和mapcat來簡化表達式:
(mapcat (fn [[a b]] (map #(vector a %) b)) theList)
通常,mapcat(或其他語言的flatmap / collect / selectmany)非常適合處理在轉換時要展平的嵌套集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.