使用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的每个元素都是一个在两个序列的笛卡尔乘积空间中迭代的双元素向量。它是使用for循环生成的,或者更确切地说,是列表理解。

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

干杯

首先,您对线程优先->宏的使用是不正确的(有关更多信息,请参阅此问题)。以下是使用线程最后一个->>宏的正确语法:

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

但是,除非确定向量x的长度,否则它是不起作用的。

但是您可以在这里使用reduce函数来处理任何元素序列:

(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))

最新更新