查找2个集合的笛卡尔积

时间:2014-12-09 10:35:04

标签: map clojure

我正在尝试在clojure中写一个函数返回笛卡尔积

(my-compute-fn [1 2 3] [4 5 6]) 

将返回

[[1 4] [1 5] [1 6] [2 4] [2 5] ....]

我的尝试导致了这个

(defn compute [col1 col2]
    (let [totcol2 (count col2)
          totcol1 (count col2)]
         (map #(vector %1 %2)
               (mapcat #(repeat totcol1 %1) col1)
               (take (* totcol1 totcol2) (cycle col2)))))

这项工作做得多,但看起来有点笨重。 什么是更好,更简洁的实现,涉及clojure.core中更容易获得的函数?

谢谢!

编辑: 找到了clojure组合,并没有看起来像魔术功能方式这样做。

1 个答案:

答案 0 :(得分:7)

for是此任务的主要候选人:

(for [a [1 2 3]
      b [4 5 6]]
  [a b])
;; => ([1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6])

您可以为for提供任意数量的seq,它会将给定的符号绑定到与它们关联的seq的每个元素。甚至还有像:when这样更酷的东西可以帮助你找到所有那些总和为7的产品:

(for [a [1 2 3]
      b [4 5 6]
      :when (= (+ a b) 7)]
  [a b])
;; => ([1 6] [2 5] [3 4])