Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在尝试使用Simpson';Clojure的规则是什么?_Clojure_Lazy Evaluation_Sicp_Eager - Fatal编程技术网

为什么我在尝试使用Simpson';Clojure的规则是什么?

为什么我在尝试使用Simpson';Clojure的规则是什么?,clojure,lazy-evaluation,sicp,eager,Clojure,Lazy Evaluation,Sicp,Eager,我试图使用Clojure完成SICP中的一些练习,但我当前执行辛普森规则的方法(例1-29)出现了错误。这与懒惰/急切的评估有关吗?有没有办法解决这个问题?错误和代码如下所示: java.lang.ClassCastException:无法将用户$simpson$h__1445强制转换为java.lang.Number 在clojure.lang.Numbers.divide(Numbers.java:139) 代码如下: (defn simpson [f a b n] (defn h []

我试图使用Clojure完成SICP中的一些练习,但我当前执行辛普森规则的方法(例1-29)出现了错误。这与懒惰/急切的评估有关吗?有没有办法解决这个问题?错误和代码如下所示:

java.lang.ClassCastException:无法将用户$simpson$h__1445强制转换为java.lang.Number 在clojure.lang.Numbers.divide(Numbers.java:139)

代码如下:

(defn simpson [f a b n]
  (defn h [] (/ (- b a) n))
  (defn simpson-term [k]
    (defn y [] (f (+ a (* k h))))
    (cond 
      (= k 0) y
      (= k n) y
      (even? k) (* 2 y)
      :else (* 4 y)))
  (* (/ h 3)
     (sum simpson-term 0 inc n)))

您将
h
定义为无参数函数,然后尝试将其当作数字使用。我也不确定你对
(sum simpson term 0 inc n)
的理解是什么;我只想假设
sum
是您从SICP获得的一些魔力,并且您传递给它的参数是正确的(我隐约记得它们定义了某种类型的通用求和)

另一件事是,将
def
defn
嵌套在
defn
中几乎总是一个糟糕的主意。您可能需要
let
(临时或本地)或另一个顶级
defn

请记住,我已经多年没有编写过
simpson
函数了,也没有检查过这个函数的算法正确性,这里有一个比你的更接近“正确形状”的草图:

(defn simpson [f a b n]
  (let [h (/ (- b a) n)
        simpson-term (fn [k]
                       (let [y (f (+ a (* k h)))]
                         (cond 
                          (= k 0) y
                          (= k n) y
                          (even? k) (* 2 y)
                          :else (* 4 y))))]
    (* (/ h 3)
       (sum simpson-term 0 inc n))))