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
有点晦涩,对于大多数问题,更简单的方法可能更好(并且更容易让未来的读者理解)。
假设我有 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
有点晦涩,对于大多数问题,更简单的方法可能更好(并且更容易让未来的读者理解)。