Clojure:运行 将单个值映射到函数列表

Clojure: Run map on a single value over a list of functions

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

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

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

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

现在假设在这个函数列表上,我想要运行一个如下图

(map #(% 3) funclist)

这给了我

=> (nil nil)

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

我是一个十足的 Clojure 菜鸟...仅供参考

-安倍

您使用 '.

将函数转换为符号
(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)

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

    (let [all-fns (juxt inc dec)]

      ;=>  (all-fns 42) => [43 41]

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