发生在Clojure中的ClassCastExpection

发生在Clojure中的ClassCastExpection,clojure,Clojure,作为序言,我对Clojure很陌生。我想知道为什么我在这段代码上得到一个ClassCastExpection。我看过了,从语法和逻辑上看,它看起来正确吗 Clojure代码: ; (load-file "cje842asg1.clj") (def lstnum '(76 85 71)) ; 2a (defn sum [list] ( (if (empty? list) 0 (+ (first list (sum (rest lis

作为序言,我对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)


非常感谢您的帮助。

代码有两个单独的错误

第一个是调用第一个list和rest list,当您打算将第二个部分作为+的第二个参数时,它使用两个参数调用第一个list

导致实际异常的另一个异常是函数体周围的额外异常。注意如果。。。这意味着您试图调用if作为函数返回的任何内容。在本例中,它返回一个数字,导致类java.lang.Long无法转换为类clojure.lang.IFn错误

更正后的版本将是

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

在本例中,将+的参数移动到单独的行中可以更容易地读取IMHO。

代码有两个单独的错误

第一个是调用第一个list和rest list,当您打算将第二个部分作为+的第二个参数时,它使用两个参数调用第一个list

导致实际异常的另一个异常是函数体周围的额外异常。注意如果。。。这意味着您试图调用if作为函数返回的任何内容。在本例中,它返回一个数字,导致类java.lang.Long无法转换为类clojure.lang.IFn错误

更正后的版本将是

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

在本例中,将+的参数移动到单独的行中可以更容易阅读IMHO。

您能指出哪行代码有额外的大括号吗?函数定义第一行的第二行及其匹配导致您将求值的数字作为函数调用。好的,这很有意义!无关评论:小心你的名字。list是clojure.core中的一个函数。在这里的代码中,这不会导致任何问题,但很容易遇到问题,对于初学者来说,这可能会导致奇怪且难以调试的错误。您能指出哪行代码有额外的大括号吗?函数定义第一行的第二行及其匹配导致您将求值的数字作为函数调用。好的,这很有意义!无关评论:小心你的名字。list是clojure.core中的一个函数。在这里的代码中,这不会导致任何问题,但很容易遇到问题,对于初学者来说,这可能会导致奇怪且难以调试的错误。因此,它应该看起来像是“第一个列表和rest列表”,而不是“第一个列表和rest列表”?就是这样!非常感谢你!所以它应该看起来像这个“``第一个列表和rest列表``而不是“第一个列表和rest列表”`?就是这样!非常感谢你!