Functional programming 作为参数的过程-方案

Functional programming 作为参数的过程-方案,functional-programming,scheme,lisp,Functional Programming,Scheme,Lisp,我正在使用以下一组方案定义。我的问题是关于“尾巴”功能的。额外的一组括号做了什么,使函数期望一个过程作为参数而不是列表(一组括号就是这种情况) (define (make-stream n f) (define (next m) (cons m (lambda () (next (f m))))) (next n)) (define head car) (define (tail stream) ((cdr stream))) (define (nth stream n

我正在使用以下一组方案定义。我的问题是关于“尾巴”功能的。额外的一组括号做了什么,使函数期望一个过程作为参数而不是列表(一组括号就是这种情况)

(define (make-stream n f)
  (define (next m)
    (cons m (lambda () (next (f m)))))
  (next n))

(define head car)

(define (tail stream)
  ((cdr stream)))

(define (nth stream n)
  (if (= n 0) (head stream)
      (nth (tail stream) (- n 1))))

(define even (make-stream 0 (lambda (n) (+ n 2))))
对不起,如果这是格式不正确或是一个不适当的问题,我正在尝试学习如何使用这个网站

我的问题是关于“尾巴”功能的。额外的一组括号做了什么,使函数期望一个过程作为参数而不是列表(一组括号就是这种情况)

(define (make-stream n f)
  (define (next m)
    (cons m (lambda () (next (f m)))))
  (next n))

(define head car)

(define (tail stream)
  ((cdr stream)))

(define (nth stream n)
  (if (= n 0) (head stream)
      (nth (tail stream) (- n 1))))

(define even (make-stream 0 (lambda (n) (+ n 2))))
这是你的程序

(define (make-stream n f)
  (define (next m)
    (cons m (lambda () (next (f m)))))
  (next n))
让我们先看看
car
cdr
将返回什么

(car (make-stream 0 f) ; => 0
(cdr (make-stream 0 f) ; => (lambda () (next (f m)))
这个由
car
返回的空值(零参数)过程称为。它通常用于延迟计算的评估。在这种情况下,它用于防止
makestream
提供两个参数后立即无限递归

为了得到下一个值,我们所要做的就是应用thunk。注意这次的额外参数

((cdr (make-stream 0 f))) ;=> (next (f m))
这就是为什么你看到

(define (tail stream) ((cdr stream)))
。。。它将返回下一个
cons
,而不是

(define (tail stream) (cdr stream))

。。。它将返回一个thunk,其中包含scheme中的下一个
cons
,表达式使用s表达式的第一个参数作为方法,使用以下参数进行计算

例如:

(+ 1 2)
它将
+
应用于1和2

如果我们把我们的例子复杂一点,我们可以这样做

(if (> x y) + -)
此处,此表达式将返回
+
符号或
-
。我们可以进一步转换这个表达式。。。为此:

((if (> x y) + -) 1 2)
这里,
if
表达式将返回
+
-
函数,该函数稍后将与1和2一起应用

现在回到你的方法

(define (tail stream)
  ((cdr stream)))
如您所见,您有双括号。这意味着它将应用
cdr
中的功能。就这么简单

如果我们查看stream的构造函数,我们可以看到构造函数实际上返回了一个以lambda函数作为第二个成员的对

make stream
的第二个参数是一个被调用以生成下一个数字的函数。方法
f
不必在每次
next
调用中传递,因为它在作用域中可用