ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn
我有一个函数,它取年数和工资,然后递归地加倍工资,直到年数用完为止。然而,我不断地发现这个错误: ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn 代码ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn,clojure,Clojure,我有一个函数,它取年数和工资,然后递归地加倍工资,直到年数用完为止。然而,我不断地发现这个错误: ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn 代码 (defn calculate-salary [years salary] (if (= years 0) (salary) (calculate-salary (- years 1) (* salary 2)))) 我对Cloju
(defn calculate-salary
[years salary]
(if (= years 0)
(salary)
(calculate-salary (- years 1) (* salary 2))))
我对Clojure很陌生,所以我相信这很简单,但我就是想不出来。在你的if条件下,你需要去掉
工资
周围的括号:
(if (= years 0)
salary
(calculate-salary (- years 1) (* salary 2))
表单(f arg1 arg2..
尝试将f
作为函数调用,并将arg1、arg2..
作为参数。因此,(salary)
尝试将salary
(a long)作为一个没有参数的函数调用,因此出现错误。
(salary)
是一个函数调用,但salary
不是一个函数,而是一个数字
解决方法是不要将其括在括号中:
(if (= years 0) salary (calculate-salary (- years 1) (* salary 2)))
错误的含义应该不太难分辨:在需要函数的地方使用了一个数字
Clojure中的括号不是分组构造,它们主要用于调用函数调用。如果您将
(salary)
更改为salary
,您将返回该数字,而不是尝试将其作为无参数函数调用。由于您是新手,我将您的函数改写为更为惯用的函数。此外,它使用recur,因此不会占用调用堆栈
(defn calculate-salary
[years salary]
(if (zero? years)
salary
(recur (dec years) (* salary 2))))
注意零的用法了吗?谓词、递归和dec
编辑:
拼写错误和语法正确。我需要把自己从我必须继承的遗产中解放出来!啊哈,谢谢你的解释。我也不清楚括号的意思。作为旁注,我也犯了同样的错误,因为我写了
(反复(阅读))
,而不是(反复阅读)
。公平地说,下面的每个人都回答正确,但我只能将其中一个标记为已接受。