将函数序列映射到序列

时间:2011-03-03 07:28:43

标签: function map clojure sequence

我如何将一系列函数中的每个函数映射到一系列值中的相应值?:

(map '(sequence of functions) '(sequence of values))

函数序列中的第n个函数应该应用于值序列中的第n个值。抱歉,如果我不是很清楚。

例如,说(def fns '(#(+ 1 %) #(- 1 %)) )

然后(map (some-clever-function-of fns) '(0 0))将产生(1 -1)因为#(+ 1 %)被映射到第一个0而#(- 1 %)被映射到第二个。

2 个答案:

答案 0 :(得分:10)

  • 传递map多个参数序列,它将完全按照您的意愿行事。 (map f seq1 seq2)期望f是一个带有两个参数的函数; map会将seq1的第一个元素和seq2的第一个元素传递给f,然后传递每个元素的第二个元素等。一旦任何seq参数运行out,map停止,所以这也适用于无限序列。
  • 考虑使用向量而不是引用列表。向量突出显示为“数据”而不是“代码”,您不必引用它们。
  • 您的示例功能无法满足您的需求;两者都返回1.我怀疑你的意思是#(+ % 1)#(- % 1)。这两个版本都在clojure.core中,分别称为incdec

所以:

user> (map (fn [f x] (f x)) 
           [inc dec] 
           [0 0])
(1 -1)

或者:

user> (map #(%1 %2) [inc dec] [0 0])
(1 -1)

答案 1 :(得分:1)

我通常会定义一个invoke函数,其行为类似于apply但没有列表折叠:

(defn invoke [f & args]
  (apply f args))

(map invoke [+ -] [1 2] [3 4])
(4 -2) ; 1 + 3, 2 - 4