Подтвердить что ты не робот

ClassCastException java.lang.Long нельзя отнести к clojure.lang.IFn

У меня есть функция, которая принимает количество лет и зарплаты, а затем рекурсивно удваивает зарплату до тех пор, пока годы не исчерпаются. Тем не менее, я продолжаю получать эту ошибку:

ClassCastException java.lang.Long нельзя отнести к clojure.lang.IFn

Код

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

Я очень новичок в Clojure, поэтому я уверен, что это что-то простое, но я просто не могу понять это.

4b9b3361

Ответ 1

Значение ошибки не должно быть слишком сложным для сортировки: используется номер, в котором ожидается функция.

Скобки в Clojure не являются конструкцией группировки, они используются в основном для вызова вызовов функций. Если вы измените (salary) на salary, вы вернете номер, а не попытаетесь вызвать его как функцию без аргументов.

Ответ 2

Поскольку вы новичок, я переписал вашу функцию, чтобы быть немного более идиоматичным. Кроме того, он использует recur, поэтому он не будет потреблять стек вызовов.

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

Обратите внимание на использование нуля? предикат, recur и dec

EDIT: опечатки и грамматика

Ответ 3

Это

(salary)

- вызов функции, но salary не является функцией - это число.

Решение состоит в том, чтобы не заключать его в круглые скобки:

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

Ответ 4

Вам нужно удалить скобки вокруг salary в условии if:

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

форма (f arg1 arg2 ..) пытается вызвать f как функцию с arg1, arg2 ... в качестве аргументов. Поэтому (salary) пытается вызвать salary (long) как функцию без аргументов, следовательно, ошибку.