首页 > 解决方案 > 在clojure中调用conj中的函数

问题描述

我是 Clojure 的新手,对函数的调用方式有点困惑。

假设我有这个功能

(defn  foo [& fns] 
   #(apply (first fns) %&))

当我调用((foo + max min) 2 3 5 1 6 4)它会返回21

当我这样定义函数时,

(defn  foo [& fns] 
   (conj [] #(apply (first fns) %&)))

我期待((foo + max min) 2 3 5 1 6 4)回来[21],但我得到了

Execution error (ArityException) at user/eval2258 (REPL:1).
Wrong number of args (6) passed to: clojure.lang.PersistentVector

这是为什么?我将如何解决它?

标签: clojure

解决方案


(defn  foo [& fns] 
   (conj [] #(apply (first fns) %&)))

我期待着((foo + max min) 2 3 5 1 6 4)回来[21]......

您的原始foo返回一个函数。现在您返回一个带有函数的向量。现在调用它时,您正在调用向量,因此是错误消息。

user=> ([] 1 2 3)
Execution error (ArityException) at user/eval150 (REPL:1).
Wrong number of args (3) passed to: clojure.lang.PersistentVector

要更正此问题,您将应用的结果放入向量中,但仍返回一个函数。但是由于您尚未使用所有传入的内容,fns因此尚不清楚,从这里建议什么。

这会给你结果,你正在寻找:

(defn  foo [& fns] 
   #(vector (apply (first fns) %&)))

推荐阅读