通过一系列函数与 seq 中的其他参数线程化数据结构

Threading a data structure through a series of functions with other params from a seq

这是对我之前问题的扩展

目的说明如下:

(defn foo
  [x a-map]
  (assoc a-map x "value"))

(defn -main
  [x]
  (let [[x1 x2 x3 ... xn] x]
    (-> {}
        (partial foo x1)
        (partial foo x2)
        (partial foo x3)
        ...
        (partial foo xn))))

这个问题的复杂性在于我必须填充可变数量的偏函数,所以我不能使用 -> 或 'comp'。 foo 函数的真正机制当然不是 assoc,所以我不能将问题简化为 zipmap

我不确定这是否重要,但输入参数 x 实际上是两个序列的笛卡尔积。所以 x 的每个元素都是一个二元素向量,它迭代两个序列的笛卡尔积 space 。它是使用 for 循环生成的,或者更确切地说,是列表推导式。

你有什么建议来处理这个问题?如果我没有提供一些重要信息,请告诉我。

干杯

首先,你对thread first -> macro is incorrect (see for more info). Here is the right syntax using thread last ->> macro的用法:

(->> {}
     (foo x1)
     (foo x2)
     (foo x3)
     (foo x4))

但是,除非向量的长度 x 是威慑力,否则它不会起作用。

但您可以在此处使用 reduce function 来处理任何元素序列:

(reduce #(assoc %1 %2 "value") {} x)

这是一个完整的例子(稍微重新定义了 foo 函数):

(defn foo
  [a-map x] ; reversed order of arguments
  (assoc a-map x "value"))

(defn -main
  [x]
  (reduce foo {} x))