调用所有可能的向量组合的函数

时间:2013-05-20 12:46:00

标签: map clojure functional-programming

自从我继续我的一位同事的项目以来,过去一周我一直在使用Clojure。我们正在使用Clojure生成一些文件。我正在尝试重构一些代码,因为他必须快速完成并硬编码大部分值。所以我有:

(defn gen [a b] (...))

我希望用

之类的内容包装它
(defn gen-vector [a-vec b-vec] (...))

gen_vector将成为我的“主要”,这意味着我将通过编写类似

的内容来触发执行
(gen-vector [1 2] [3 4])

我希望得到gen的所有组合,比如执行:

(gen 1 3)
(gen 1 4)
(gen 2 3)
(gen 2 4)

到目前为止我所拥有的是

(map #(gen %1 %2) countries fieldchar)

但是,这并没有做到这一点,因为它只做1-3,2-4。关于如何实现这个的任何想法?

此致 低糜

1 个答案:

答案 0 :(得分:5)

要获得(gen x y)的延迟值,请使用

(for [x x-vec
      y y-vec]
  (gen x y))

如果gen是一个没有有用返回值的副作用调用函数,那么您需要将for替换为doseq

fordoseq的基本形式 1 为输入序列的笛卡尔乘积中的每个元组计算它们的实体。相反,(map f xs ys ...)以锁步方式遍历序列,因此只使用序列中匹配位置的元素元组。


1 还有一种用于过滤(:when)的迷你语言,提前停止循环(:while)并引入本地绑定(:let)在绑定向量内。有关语法的概述,请参阅(doc for),有关:when:while的示例,请参阅this recent answer of mine