clojure - 在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
这是为什么?我将如何解决它?
解决方案
(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) %&)))
推荐阅读
- django - 如何使用 django 为 html 文件中的代码编写标签?
- python - Xgboost 在 windows 上安装错误 .OSError: [WinError 127] The specified procedure could not be found
- parallel-processing - 什么时候可以并行调用使用可变变量的函数?
- algorithm - 如何计算特定函数将在递归中执行的次数?
- android - 在适配器中膨胀不同的布局
- mysql - MySQL 查询时间过长,未使用索引
- ruby-on-rails - Twitter 句柄名称中的空字符是什么样的?
- c# - 如何将命令中的文本框文本作为参数 WPF 传递
- android - 如何退出 App Inventor 中的应用程序?
- java - 使用元音或一组字符分割字符串