这个 Clojure 函数有什么问题?

What's wrong with this Clojure function?

我是 clojure 的新手,我写了这个函数:

 (def fact (fn [n] (
   (apply * (drop 1 (range n))))))

调用它时出现错误:

ClassCastException class java.lang.Long cannot be cast to class clojure.lang.IFn (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'app') my-stuff.core/fact (form-init3352210926102455316.clj:18)

为什么?

你在申请周围多了一个括号:

(def fact (fn [n]
              (apply * (drop 1 (range n)))))

有一对额外的括号-当您调用例如(fact 3)时,结果将是(2)(不是列表,而是函数调用)并且2不是函数,所以它会抛出错误。

当您删除这些括号时,如下所示:

(def fact (fn [n]
    (apply * (drop 1 (range n)))))

, call (fact 3) returns 2——但是这个结果正确吗?如果你想return给定数字的阶乘,你必须正确使用range

(defn fact [n]
  (->> (range 1 (inc n))
       (apply *)))

->> 是线程最后一个宏)

示例:

(fact 3)
=> 6