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