如何在Clojure中将值应用于多个函数?

10

基本上,我需要做类似于map的事情,但是与将函数应用于集合中的所有元素不同,我需要将相同(一组)值应用于一组函数(这个操作有一个名称吗?)。这可能看起来像一个简单的问题,但我还没有找到在Clojure中完成它的惯用方法。对于仅需要将一个值应用于每个函数的特殊情况,例如,我已经使用了

(for [f funs] (f value))

那么,value 当然是我需要每个函数作为参数传递的值,而 funs 则是需要使用 value 作为参数调用的函数集合。

我的问题是,Clojure 中是否有一个函数可以实现此功能,并且还能推广到任意数量的参数?或者以上面的代码确实是 Clojure 中的惯用写法?

2个回答

22
您正在寻找juxtjuxt 接受一组函数并返回一个函数,该函数是这些函数的并置。返回的函数接受可变数量的参数,并返回包含将每个函数应用于参数(从左到右)的结果的向量。 ((juxt a b c) x) => [(a x) (b x) (c x)]

9

以下是来自《CLOJURE for the BRAVE and TRUE》章节的内容:

使用 map 还有个有趣的功能,可以通过传入函数集合对多个数字集合进行一组计算:

(def sum #(reduce + %))
(def avg #(/ (sum %) (count %)))
(defn stats
  [numbers]
  (map #(% numbers) [sum count avg]))

(stats [3 4 10])
; => (17 3 17/3)

(stats [80 1 44 13 6])
; => (144 5 144/5)

我从来没有想过把“%”放在列表的开头。不错。 - monojohnny
1
非常好。这个例子确实帮助我更好地理解了一点。 谢谢!我发现Clojure真的是一门一流的语言。(这是个笑话和观察) (map #(apply % (range 1 3)) [+ - / *]);从来没有想过把函数放到一个列表中... - monojohnny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接