【问题标题】:ClassCastException java.lang.Long cannot be cast to clojure.lang.IFnClassCastException java.lang.Long 无法转换为 clojure.lang.IFn
【发布时间】:2014-11-03 18:43:14
【问题描述】:

我有一个函数,它需要年数和薪水,然后递归地将薪水翻倍,直到用完年数。但是,我不断收到此错误:

ClassCastException java.lang.Long 无法转换为 clojure.lang.IFn

守则

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

我对 Clojure 很陌生,所以我确信它很简单,但我似乎无法弄清楚。

【问题讨论】:

  • 公平地说,下面的每个人都答对了,但我只能将一个标记为接受。

标签: clojure


【解决方案1】:

这个错误的含义应该不难理解:一个数字被用在了预期的函数中。

Clojure 中的括号不是分组结构,它们主要用于调用函数调用。如果您将(salary) 更改为salary,您将返回该数字,而不是尝试将其作为无参数函数调用。

【讨论】:

  • 正确。我需要把自己从我必须的遗产中解放出来!
  • 啊哈感谢您的解释。我也不清楚括号的含义。作为旁注,我有同样的错误,因为我写了(repeatedly (read)) 而不是(repeatedly read)。
【解决方案2】:

由于您是新人,因此我重写了您的函数,使其更加惯用。此外,它使用 recur,因此不会消耗调用堆栈。

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

注意零的使用?谓词、递归和dec

编辑: 错别字和语法

【讨论】:

    【解决方案3】:

    这个

    (salary)
    

    是一个函数调用,但salary 不是一个函数——它是一个数字。

    解决办法是不用括号括起来:

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

    【讨论】:

      【解决方案4】:

      您需要删除 if 条件中 salary 周围的括号:

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

      (f arg1 arg2 ..) 形式尝试将f 作为函数调用,arg1, arg2 ... 作为参数。因此,(salary) 尝试将 salary(长整型)作为没有参数的函数调用,因此出现错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多