【问题标题】:Call function for all possible combinations of vectors调用所有可能的向量组合的函数
【发布时间】:2013-05-20 12:45:59
【问题描述】:

自从我继续我同事的一个项目以来,我过去一周一直在使用 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。关于如何实现这一点的任何想法?

问候, 迪米

【问题讨论】:

    标签: map clojure functional-programming


    【解决方案1】:

    要获得 (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),并可能在 this recent answer of mine 中查看涉及 :when:while 的示例。

    【讨论】:

    • 感谢迈克尔的快速回复。这工作得很好:) 干杯
    • 不用担心。刚刚添加了关于理解与map 和过滤/绑定迷你语言的评论以确保完整性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多