通过一系列函数与来自seq的其他参数进行数据结构的线程化

时间:2015-03-25 07:55:39

标签: clojure

这是我上一个问题here的扩展。

目的如下:

(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循环生成的,或者说是列表推导。

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

干杯

1 个答案:

答案 0 :(得分:1)

首先,您对thread first -> macro的使用不正确(有关详细信息,请参阅this question)。以下是使用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))