繁体   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