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

5

另一个:

(for [[x inner-xs] theList
      inner-x      inner-xs]
  [x inner-x])

for对于嵌套集合和平面结果非常有用。

于 2013-06-17T05:51:09.340 回答
3

我会通过以下方式做到这一点。它使用解构和 mapcat 来简化表达式:

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

一般来说,mapcat(或其他语言中的 flatmap/collect/selectmany)非常适合处理您想要在转换它们时展平的嵌套集合。

于 2013-06-16T20:15:14.573 回答