2014-11-03 12 views
26

Mam funkcję, która zajmuje liczbę lat i wynagrodzenie, a następnie rekurencyjnie podwaja wynagrodzenie do wyczerpania lat. Jednak wciąż otrzymuję ten błąd:ClassCastException java.lang.Long nie można przenieść na clojure.lang.IFn

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

Kodeks

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

jestem bardzo nowy w Clojure więc jestem pewien, że jest to coś proste, ale ja po prostu nie może wydawać się rozwiązać.

+1

Aby być uczciwym, poniżej każdy odpowiedział poprawnie, ale mogę tylko zaznaczyć jedną jako zaakceptowane. –

Odpowiedz

32

błędu nie powinno być zbyt trudne, aby uporządkować: numer jest używany, gdy spodziewana jest funkcja.

Nawiasy w Clojure nie są konstrukcją grupującą, służą głównie do wywoływania wywołań funkcji. Jeśli zmienisz (salary) na salary, zwrócisz liczbę zamiast próbować wywołać ją jako funkcję bezargumentową.

+3

Zaraz. Muszę uwolnić się od mojego imperatywnego dziedzictwa! –

+0

Aha dzięki za wyjaśnienie. Znaczenie nawiasów również nie było dla mnie jasne. Na marginesie miałem ten sam błąd, ponieważ napisałem '(wielokrotnie (czytaj))' zamiast '(wielokrotnie czytałem)'. – Cilyan

3

Musisz usunąć wsporniki z całego salary w swojej jeśli warunek:

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

na formę (f arg1 arg2 ..) próby zadzwonić f jako funkcję z arg1, arg2 ... jako argumenty. Dlatego też (salary) próbuje wywołać salary (długą) jako funkcję bez żadnych argumentów, stąd błąd.

5

Ten

(salary) 

jest wywołanie funkcji, ale salary nie jest funkcją - jest to liczba.

Rozwiązaniem jest nie zawinąć go w nawiasach: sens

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

Ponieważ jesteś nowy, przepisuję twoją funkcję, by była nieco bardziej idiomatyczna. Używa również funkcji recur, aby nie zużywać stosu wywołań.

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

Zwróć uwagę na użycie zera? orzeczenie, powtarzać i grudnia

EDIT: literówki i gramatyki

Powiązane problemy