ClassCastException java.lang.Long无法强制转换为clojure.lang.IFn

时间:2014-11-03 18:43:15

标签: clojure

我有一个功能,需要多少年和工资,然后递归加倍工资,直到几年用尽。但是,我一直收到这个错误:

  

ClassCastException java.lang.Long无法强制转换为clojure.lang.IFn

守则

(defn calculate-salary
    [years salary]
    (if (= years 0)
        (salary)
        (calculate-salary (- years 1) (* salary 2))))

我对Clojure很新,所以我确信它很简单,但我似乎无法弄明白。

4 个答案:

答案 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)作为没有参数的函数调用,因此错误。