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

Scheme 从函数返回函数的目的是什么?,scheme,lisp,racket,higher-order-functions,sicp,Scheme,Lisp,Racket,Higher Order Functions,Sicp,我正在研究SICP,但我并没有完全理解函数返回背后的概念 (define (deriv g) (lambda (x) (/ (- (g (+ x dx)) (g x)) dx))) 上面的代码将被用作((deriv square)10),为什么我们不能让这个代码更简单呢?通过一步评估结果 (define (deriv g x) (/ (- (g (+ x dx)) (g x)) dx)) 为什么我们真的需要函数作为返回值? 抽象?部分应用?我想有一个

我正在研究SICP,但我并没有完全理解函数返回背后的概念

(define (deriv g)
  (lambda (x)
    (/ (- (g (+ x dx)) (g x))
       dx)))
上面的代码将被用作((deriv square)10),为什么我们不能让这个代码更简单呢?通过一步评估结果

(define (deriv g x)
 (/ (- (g (+ x dx)) (g x))
       dx))
为什么我们真的需要函数作为返回值?
抽象?部分应用?我想有一个更简单更清晰的想法,我们需要它做什么,在哪里使用它。谢谢

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

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

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

(fplot (deriv sin) (- pi) pi)
fplot
根本不需要知道它的绘图函数来自何处。另一种方法是编写一个特殊函数来绘制一个函数的导数,然后可能编写另一个函数来绘制二阶导数,依此类推,然后最终编写一个函数,它接受一个函数和一个整数,并绘制它的导数阶数或其他

然后你会意识到,如果设计一个函数的任务是绘制函数,另一个函数的任务是计算函数的导数,那么这些东西就会很好地组合在一起。考虑
(let((dsq(deriv square))(map dsq(range 0 100 0.1)))
(图(λ(x)(德里夫平方x))(范围0 100 0.1))


第一个代码段中的部分应用程序预先计算了某些内容,第二个代码必须在每次
x
时重复这些内容,这是浪费。

将其视为返回专用函数的通用函数;一个“函数生成器”,用于抽象出可用于更具体用途的通用代码。