Exercism Clojure 练习

Exercism Clojure exercise

我正在通过 Exercism 学习 clojure,但在完成千层面问题的最后一部分时遇到了一些困难。

这里是指令 - 定义带有两个参数的总时间函数:第一个参数是你添加到千层面的层数,第二个参数是千层面在烤箱中的分钟数.该函数应该 return 您总共烹饪了多少分钟的烤宽面条,这是准备时间(以分钟为单位)和烤宽面条目前在烤箱中花费的时间(以分钟为单位)的总和。

这是给我带来麻烦的代码:

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

(def sum (prep-time times-two))

(defn total-time [num-layers actual-time]
  (def test1 (prep-time num-layers))
  (+ test1 actual-time))

(def finished (total-time test1 prep-time))

我收到一条错误消息:

`(defn prep-time [num-layers] 
11:   (* times-two num-layers))    
        ^--sci.impl.fns$fun$arity_1__1213 cannot be cast to java.lang.Number`

为什么我会收到这个错误,它意味着什么?

不要在 defn 中使用 def。如果你真的需要一些变量,你可以使用let,但是没有它也可以完成这个练习:

(ns lucians-luscious-lasagna)

(def expected-time 40)

(defn remaining-time [actual-time]
  (- expected-time actual-time))

(defn prep-time [num-layers]
  (* num-layers 2))

(defn total-time [num-layers actual-time]
  (+ (prep-time num-layers) actual-time))

要回答有关转换错误的具体问题,这是因为 times-two 是一个函数,但您将其传递给 *,后者期望其参数为数字。

您没有指定如何定义 times-two,但我怀疑您的意思是该行是 (times-two num-layers) — 或者只是 (* 2 num-layers).

但是,与 一样,在 defn 中使用 def 几乎可以肯定是对 def 的误用——请改用 let。您不需要 test1 成为全局变量 — 将 test1 传递给 total-time 没有任何意义,因为 total-timetest1 的定义位置!事实上,通过将 test1 传递给 total-time,您将有效地将其重新定义为原始值的两倍。

我还建议您重新检查 'actual-time' 参数的名称选择。我不清楚“实际”时间是什么意思。这不是到目前为止在烤箱中花费的时间吗?也许 oven-time 是一个不那么模糊的名字。