【问题标题】:How to apply values to multiple functions in Clojure?如何将值应用于 Clojure 中的多个函数?
【发布时间】:2013-07-26 07:25:54
【问题描述】:

基本上,我需要做类似map 之类的事情,但是我不需要将函数应用于集合中的所有元素,而是需要将相同的(一组)值应用于函数集合(这样做操作有名字吗?)。这似乎是一个简单的问题,但我还没有在 Clojure 中找到一种惯用的方法。对于我只需要对每个函数应用一个值的特殊情况,例如,我使用了

(for [f funs] (f value))

value 当然是我需要每个函数作为参数的值,funs 是需要以value 作为参数调用的函数的集合。

那么,我的问题是,Clojure 中是否有一个函数可以做到这一点,但也适用于任意数量的参数?还是上面确实是惯用的 Clojure?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您正在寻找juxt

    并列

    接受一组函数并返回一个fn,即并列 那些fns。返回的 fn 采用可变数量的参数,并且 返回一个向量,其中包含将每个 fn 应用于 args(从左到右)。 ((并列 a b c) x) => [(a x) (b x) (c x)]

    【讨论】:

      【解决方案2】:

      来自 CLOJURE 的 a section,代表 BRAVE 和 TRUE

      您可以用地图做的另一件有趣的事情是传递给它一个集合 职能。如果您想执行一组操作,可以使用它 对不同的数字集合进行计算,如下所示:

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

      【讨论】:

      • 我从未想过将“%”放在列表的开头。不错。
      • 太棒了。这个小例子真的帮助我理解了一点点。谢谢!我看到 Clojure 确实是一门一流的语言。 (这是一个笑话和一个观察)(map #(apply % (range 1 3)) [+ - / *]);我从来没有想过将这些功能放在一个列表中......
      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2014-06-01
      • 2012-06-09
      • 2017-10-08
      • 2020-09-04
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多