【问题标题】:What's wrong with this Clojure function? [duplicate]这个 Clojure 函数有什么问题? [复制]
【发布时间】:2022-01-13 16:21:46
【问题描述】:

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

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

调用它时出现错误:

ClassCastException 类 java.lang.Long 无法转换为类 clojure.lang.IFn(java.lang.Long 位于加载器“bootstrap”的模块 java.base 中;clojure.lang.IFn 位于加载器的未命名模块中“ app') my-stuff.core/fact (form-init3352210926102455316.clj:18)

为什么?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    apply 周围多了一个括号:

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

    【讨论】:

    • 哇,谢谢,我现在就删除我的问题
    【解决方案2】:

    还有一对额外的括号 - 例如,当您调用 (fact 3) 时,结果将是 (2)(不是列表,而是函数调用)并且 2 不是函数,因此会引发错误。

    当你删除这些括号时,像这样:

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

    ,调用(fact 3) 返回2- 但这个结果正确吗?如果你想返回给定数字的阶乘,你必须正确使用range

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

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

    例子:

    (fact 3)
    => 6
    

    【讨论】:

    • 谢谢,很有启发性
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2020-06-17
    • 2017-03-26
    • 2014-06-29
    • 2011-02-13
    相关资源
    最近更新 更多