2014-11-03 12 views
26

umgewandelt werden Ich habe eine Funktion, die die Anzahl der Jahre und Gehalt nimmt, rekursiv verdoppelt dann das Gehalt bis Jahre erschöpft ist. Aber ich erhalte immer diese Fehlermeldung:ClassCastException java.lang.Long kann nicht in clojure.lang.IFn

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

Der Kodex

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

Ich bin sehr neu für Clojure so seine etwas einfach Ich bin sicher, aber ich kann einfach nicht scheinen zu finde es heraus.

+1

Um fair zu sein, jeder unten richtig beantwortet, aber ich kann man nur als angenommen markieren. –

Antwort

32

Die Bedeutung der Fehler nicht allzu schwer zu klären sein sollte: eine Zahl verwendet wird, in dem eine Funktion erwartet wird.

Klammer in Clojure sind kein Gruppenkonstrukt, sie werden hauptsächlich zum Aufrufen von Funktionsaufrufen verwendet. Wenn Sie (salary) zu salary ändern, werden Sie die Nummer zurückgeben, anstatt zu versuchen, sie als keine Argumentfunktion zu bezeichnen.

+3

Direkt an. Ich muss mich von meinem imperativen Erbe befreien! –

+0

Aha danke für die Erklärung. Die Bedeutung der Klammer war mir auch nicht klar. Als Nebenbemerkung hatte ich den gleichen Fehler, weil ich "(wiederholt (gelesen))" anstelle von "(wiederholt gelesen)" geschrieben habe. – Cilyan

3

Sie müssen die Klammern aus der ganzen salary in Ihrem wenn entfernen Zustand:

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

die Form (f arg1 arg2 ..) Versuche f als Funktion mit arg1, arg2 ... als Argumente zu nennen. Daher versucht (salary)salary (eine lange) als eine Funktion ohne Argumente, daher der Fehler aufzurufen.

5

Diese

(salary) 

ist ein Funktionsaufruf, aber salary ist keine Funktion - es ist eine Zahl.

ist die Lösung nicht in Klammern wickeln:

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

Da Sie neu sind, schrieb ich Ihre Funktion um ein bisschen mehr idiomatisch. Außerdem verwendet es Wiederholungen, so dass es den Aufruf-Stack nicht verbrauchen wird.

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

Beachten Sie die Verwendung der Null? Prädikat, wieder auftreten und Dezember

EDIT: Tipp- und Grammatik

Verwandte Themen