ClassCastExpection происходит в Clojure - PullRequest
1 голос
/ 25 января 2020

В предисловии я очень новичок в Clojure. Мне было интересно, почему я получаю ClassCastExpection на этот кусок кода. Я смотрел на это и синтаксически и логически это выглядит правильно?

Код Clojure:

; (load-file "cje842asg1.clj")
(def lstnum '(76 85 71))
; 2a
(defn sum [list] (
        (if (empty? list) 
            0
            (+ (first list (sum (rest list))))
        )
    )
)
; if empty return zero, else add the first num in list and pass in the 
; rest.

(sum lstnum)

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 25 января 2020

В коде есть две отдельные ошибки.

Первая вызывает (first list (sum (rest list))), которая вызывает first с 2 аргументами, когда вы хотели сделать вторую часть вторым аргументом +.

Еще одно, приводящее к фактическому исключению, - это дополнительные () вокруг тела функции. Обратите внимание на ((if ...)), что означает, что вы пытаетесь вызвать то, что if возвращает как функцию. В этом случае он возвращает число, что приводит к ошибке class java.lang.Long cannot be cast to class clojure.lang.IFn.

Исправленная версия будет иметь вид

(defn sum [list]
  (if (empty? list)
    0
    (+ (first list)
       (sum (rest list)))))

Перемещение аргументов в + в отдельные строки облегчает читать в этом случае (ИМХО).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...