这个 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
我是 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