Clojure函数在集合中产生"内部笛卡尔积"

Mar*_*tus 1 clojure

给出清单:

'( [:a [:a1 :a2]]  [:b [:b1 :b2 :b3]] )
Run Code Online (Sandbox Code Playgroud)

如何生成列表:

'( [:a :a1] [:a :a1] [:b :b1] [:b :b2] [:b :b3] )
Run Code Online (Sandbox Code Playgroud)

(这是一种元素扩展笛卡尔积与1级扁平化相结合)

我能想到的最好的是:

(apply concat (map #(for [v (second %)] (vector (first %) v)) TheList))
Run Code Online (Sandbox Code Playgroud)

这看起来过于复杂; 实现它的更惯用的方法是什么?

此外,当尝试在列表中执行这种元素扩展笛卡尔积 - 产品时,应该考虑哪些函数系列?(我完全不知道如何描述它).

kot*_*rak 5

另一个:

(for [[x inner-xs] theList
      inner-x      inner-xs]
  [x inner-x])
Run Code Online (Sandbox Code Playgroud)

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