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

Jac*_*and 33 clojure

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

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

代码

(defn calculate-salary
    [years salary]
    (if (= years 0)
        (salary)
        (calculate-salary (- years 1) (* salary 2))))
Run Code Online (Sandbox Code Playgroud)

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

noi*_*ith 42

错误的含义不应该太难理解:在预期函数的地方使用数字.

Clojure中的括号不是分组构造,它们主要用于调用函数调用.如果更改(salary)salary,则返回数字而不是尝试将其称为无参数函数.

  • 对吧.我需要释放自己的命令性遗产! (3认同)

Red*_*ins 7

因为你是新手,所以我重写了你的功能,使其更加惯用.此外,它使用recur,因此它不会消耗调用堆栈.

(defn calculate-salary
  [years salary]
  (if (zero? years)
    salary
    (recur (dec years) (* salary 2))))
Run Code Online (Sandbox Code Playgroud)

注意使用零?谓词,复发和十进制

编辑:拼写错误和语法


mip*_*adi 6

这个

(salary)
Run Code Online (Sandbox Code Playgroud)

是函数调用,但salary不是函数 - 它是一个数字.

解决方案是不将它包装在括号中:

(if (= years 0) salary (calculate-salary (- years 1) (* salary 2)))
Run Code Online (Sandbox Code Playgroud)