2014-11-03 88 views
26

我有一個函數,它需要年和薪水的數量,然後遞歸地加倍薪水,直到數年耗盡。不過,我不斷收到此錯誤:ClassCastException java.lang.Long不能轉換成clojure.lang.IFn

ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn

守則

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

我很新的Clojure的,所以我敢肯定它的簡單的東西,但我似乎無法想辦法。

+1

爲了公平起見,下面大家答對,但我只能一個標記爲接受。 – 2014-11-03 19:02:31

回答

32

錯誤的含義不應太硬理清:正在使用的其中一個功能是預期數量。

Clojure中的括號不是一個分組構造,它們主要用於調用函數調用。如果將(salary)更改爲salary,您將返回該數字而不是嘗試將其作爲無參數函數調用。

+3

對。我需要從我的命令遺產中釋放自己! – 2014-11-03 18:51:16

+0

阿哈感謝您的解釋。括號的含義對我來說也不是很清楚。作爲旁註,我有同樣的錯誤,因爲我寫了'(重複(讀取))'而不是'(重複讀取)''。 – Cilyan 2015-03-17 23:58:06

3

您需要刪除從各地salary括號中的if條件:

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

形式(f arg1 arg2 ..)試圖與arg1, arg2 ...f作爲函數作爲參數。因此(salary)試圖調用salary(長)作爲一個函數沒有參數,因此錯誤。

5

(salary) 

是一個函數調用,但salary不是一個功能 - 這是一個數字。

的解決方案是在括號中沒有把它包裝:

(if (= years 0) salary (calculate-salary (- years 1) (* salary 2))) 
6

由於您是新手,我重寫了您的功能,使其更具地道性。此外,它使用重複發生,因此它不會消耗調用堆棧。

(defn calculate-salary 
    [years salary] 
    (if (zero? years) 
    salary 
    (recur (dec years) (* salary 2)))) 

注意使用零?謂語,復發和DEC

編輯: 錯別字和語法

相關問題