我如何将一系列函数中的每个函数映射到一系列值中的相应值?:
(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 %)
被映射到第二个。
答案 0 :(得分:10)
map
多个参数序列,它将完全按照您的意愿行事。 (map f seq1 seq2)
期望f
是一个带有两个参数的函数; map
会将seq1
的第一个元素和seq2
的第一个元素传递给f
,然后传递每个元素的第二个元素等。一旦任何seq参数运行out,map
停止,所以这也适用于无限序列。#(+ % 1)
和#(- % 1)
。这两个版本都在clojure.core
中,分别称为inc
和dec
。所以:
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