我有一个功能,需要多少年和工资,然后递归加倍工资,直到几年用尽。但是,我一直收到这个错误:
ClassCastException java.lang.Long无法强制转换为clojure.lang.IFn
守则
(defn calculate-salary
[years salary]
(if (= years 0)
(salary)
(calculate-salary (- years 1) (* salary 2))))
我对Clojure很新,所以我确信它很简单,但我似乎无法弄明白。
答案 0 :(得分:39)
错误的含义不应该太难理解:在预期功能的地方使用了一个数字。
Clojure中的括号不是分组构造,它们主要用于调用函数调用。如果您将(salary)
更改为salary
,您将返回该数字,而不是尝试将其称为无参数函数。
答案 1 :(得分:7)
因为你是新手,所以我重写了你的功能,使其更加惯用。此外,它使用recur,因此它不会消耗调用堆栈。
(defn calculate-salary
[years salary]
(if (zero? years)
salary
(recur (dec years) (* salary 2))))
注意使用零?谓词,复发和十进制
编辑: 拼写错误和语法
答案 2 :(得分:6)
此
(salary)
是函数调用,但salary
不是函数 - 它是一个数字。
解决方案是不将它包装在括号中:
(if (= years 0) salary (calculate-salary (- years 1) (* salary 2)))
答案 3 :(得分:4)
您需要从if条件中的salary
左右删除括号:
(if (= years 0)
salary
(calculate-salary (- years 1) (* salary 2))
表单(f arg1 arg2 ..)
尝试将f
作为函数调用arg1, arg2 ...
作为参数。因此(salary)
尝试将salary
(long)作为没有参数的函数调用,因此错误。