You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Exercism Clojure千层面练习:total-time函数类型转换报错问题咨询

解决Clojure千层面问题中的类型转换错误:sci.impl.fns$fun$arity_1__1213 cannot be cast to java.lang.Number

看起来你在Exercism的Clojure千层面问题上卡壳了,咱们一步步拆解这个错误和你的代码问题。

错误原因解析

你看到的错误 sci.impl.fns$fun$arity_1__1213 cannot be cast to java.lang.Number 核心意思是:你试图把一个函数当作数字来进行数学运算,而Clojure无法将函数类型转换为数字类型,所以抛出了这个异常。

具体到你的代码里,问题出在这一行:

(defn prep-time [num-layers] (* times-two num-layers))

这里的 times-two 应该是一个代表每层准备时间的数字(根据Exercism的题目要求,每层需要2分钟准备时间),但你大概率没有定义过名为 times-two 的数字变量——反而可能误把它当成了一个函数名,或者完全是拼写/概念错误。当Clojure找不到这个数字变量时,它可能把其他同名的函数(比如你可能不小心定义过的)当成了这个值,导致乘法运算时试图用函数和数字相乘,触发类型转换错误。

你的代码里的其他问题

除了这个核心错误,你的代码还有几个逻辑问题需要修正:

  • 错误的变量绑定与函数调用:
    (def sum (prep-time times-two))
    
    这里调用 prep-time 时传入的是 times-two(函数/未定义变量),而不是具体的层数数字,完全不符合函数的参数要求。
  • 在函数内部使用def:
    (defn total-time [num-layers actual-time] (def test1 (prep-time num-layers)) (+ test1 actual-time))
    
    在函数内部用 def 会创建全局变量,这不是正确的做法,应该用 let 来创建局部绑定,避免污染全局命名空间。
  • 错误的函数调用参数:
    (def finished (total-time test1 prep-time))
    
    这里调用 total-time 时,第一个参数 test1 是你在 total-time 函数内部定义的局部变量(而且还是用错误的def定义的),外部根本访问不到;第二个参数 prep-time 是函数本身,不是实际的烘烤分钟数,完全不符合参数要求。

修正后的代码示例

根据题目的要求,我们可以这样正确实现:

;; 定义每层的准备时间为2分钟,用一个清晰的变量名
(def minutes-per-layer 2)

;; 计算准备时间:层数 × 每层准备时间
(defn prep-time [num-layers]
  (* num-layers minutes-per-layer))

;; 计算总耗时:准备时间 + 已烘烤时间
(defn total-time [num-layers actual-time]
  (let [prep-minutes (prep-time num-layers)]
    (+ prep-minutes actual-time)))

;; 测试示例:比如10层,已经烤了30分钟
(def finished (total-time 10 30))
;; 结果应该是 10*2 +30 =50

总结

这个错误的本质是类型不匹配:你试图将函数当作数字进行运算。解决的核心是明确变量的类型——确保数学运算中用到的都是数字类型,同时遵循Clojure的函数调用和局部绑定规范,避免错误地传递参数或使用全局变量。

内容的提问来源于stack exchange,提问作者Tyler Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:32:34