【问题标题】:Clojure: Run map on a single value over a list of functions [duplicate]Clojure:在函数列表上的单个值上运行映射[重复]
【发布时间】:2021-02-15 20:26:52
【问题描述】:

假设我有 2 个函数 add1 和 sub1,定义如下。从这些函数中,我创建了一个向量 funclist。

(defn add1
  [x]
  (+ x 1))

(defn sub1
  [x]
  (- x 1))

(def funclist (vec '(add1 sub1)))

假设现在在这个函数列表中,我想运行如下的地图

(map #(% 3) funclist)

这给了我

=> (nil nil)

我期待(4 2)...。我做错了什么?

我是一个完整的 Clojure 菜鸟......仅供参考

-安倍

【问题讨论】:

    标签: function dictionary vector clojure


    【解决方案1】:

    您使用' 将函数转换为符号。

    (map #(type %) funclist) ;; => (clojure.lang.Symbol clojure.lang.Symbol)
    

    然而,符号也是函数。它们可用于查找get。 因此nil 结果:

    ('inc 42)
    ; → nil
    

    改变

    (def funclist (vec '(add1 sub1)))
    

    (def funclist (vector add1 sub1)) ;; or [add1 sub1]
    

    它会起作用的。

    (map #(% 3) funclist) ;;=> (4 2)
    

    【讨论】:

    • 非常感谢亚伦。这对帮助我了解 Clojure 大有帮助。
    【解决方案2】:

    您可以使用内置函数juxt 完成类似的操作:

        (let [all-fns (juxt inc dec)]
    
          ;=>  (all-fns 42) => [43 41]
    

    一个警告:juxt 有点晦涩难懂,更简单的方法可能更适合大多数问题(并且更容易让未来的读者理解)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2018-10-09
      相关资源
      最近更新 更多