ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn

前端 未结 4 1741
一向
一向 2020-12-30 19:17

I have a function that takes the number of years and salary, then recursively doubles the salary until years is exhausted. However, I keep getting this error:

相关标签:
4条回答
  • 2020-12-30 19:51

    This

    (salary)
    

    is a function call, but salary is not a function -- it's a number.

    The solution is to not wrap it in parentheses:

    (if (= years 0) salary (calculate-salary (- years 1) (* salary 2)))
    
    0 讨论(0)
  • 2020-12-30 19:59

    Since you are new I rewrote your function to be a bit more idiomatic. Also, it uses recur so it will not consume the call stack.

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

    Notice the use of the zero? predicate, recur, and dec

    EDIT: typos and grammar

    0 讨论(0)
  • 2020-12-30 20:08

    You need to remove the brackets from around salary in your if condition:

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

    the form (f arg1 arg2 ..) attempts to call f as a function with arg1, arg2 ... as arguments. Therefore (salary) attempts to invoke salary (a long) as a function with no arguments, hence the error.

    0 讨论(0)
  • 2020-12-30 20:10

    The error's meaning shouldn't be too hard to sort out: a number is being used where a function is expected.

    Parenthesis in Clojure are not a grouping construct, they are used primarily to invoke function calls. If you change (salary) to salary you will return the number rather than attempting to call it as a no-argument function.

    0 讨论(0)
提交回复
热议问题