簡體   English   中英

Clojure函數可在集合中產生“內部笛卡爾積”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM