我正在尝试在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组合,并没有看起来像魔术功能方式这样做。
答案 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])