从函数返回函数的目的是什么?

问题描述

我正在学习 SICP,但我并没有完全理解函数返回背后的想法。

(define (deriv g)
  (lambda (x)
    (/ (- (g (+ x dx)) (g x))
       dx)))

上面的代码将用作((deriv square) 10),为什么我们不能让这段代码更简单呢?通过 1 步评估结果?

(define (deriv g x)
 (/ (- (g (+ x dx)) (g x))
       dx))

为什么我们真的需要函数作为返回值? 抽象?部分应用?我想有一个更简单、更清晰的想法,我们需要它做什么,以及在哪里使用它。谢谢!

解决方法

嗯,在这种情况下,因为在数学上,函数的导数是一个函数。因此,如果您想要一个计算函数导数的函数,那么它将返回一个函数。

这很有用。想象一下,如果您有一个名为 fplot 的函数,它将在两个值之间绘制一个函数。然后我可以用

绘制函数sin
(fplot sin (- pi) pi)

说。现在,如果我想绘制 sin 的导数(假设我不知道它是 cos),我可以绘制它:

(fplot (deriv sin) (- pi) pi)

fplot 根本不需要知道它绘制的函数来自哪里。另一种方法是编写一个特殊的函数来绘制函数的导数,然后可能编写另一个函数来绘制二阶导数等等,然后最终某个函数接受一个函数和一个整数并绘制出它什么的。

然后你会意识到,有一个函数的工作是绘制函数,另一个函数的工作是计算作为函数的导数的函数,然后这些不是更好的设计吗?事情会很好地组合在一起。

,

考虑 (let ((dsq (deriv square))) (map dsq (range 0 100 0.1)))(map (lambda (x) (deriv square x)) (range 0 100 0.1))

第一个代码段中的部分应用程序预先计算了一些东西,第二个代码必须在每个 x 处一次又一次地重做,这很浪费。