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, поэтому я уверен, что это что-то простое, но я просто не могу понять это.
Ответы
Ответ 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) как функцию без аргументов, следовательно, ошибку.