我对Scheme、函数式编程,尤其是流式编程完全陌生。以下流中的前五个整数是什么?
(define (mystery x y z)
(cons x
(lambda ()
(mystery y z (+ x y z)))))
(mystery 1 2 3)
这是如何工作的,我如何在Racket中使用它?
我们可以通过实现一个过程来检查无限流的内容,该过程消耗给定数量的元素并在列表中返回它们,例如:
(define (print strm n)
(if (zero? n)
'()
(cons (car strm)
(print ((cdr strm)) (sub1 n)))))
如果我们将其应用于您的流,以下是我们获得的:
(print (mystery 1 2 3) 5)
=> '(1 2 3 6 11)
尽管在这种情况下,如果我们试图了解引擎盖下发生了什么,它会更有用。最后,这只是一系列过程调用,如果我们注意到每次调用时传递的参数,就很容易找到答案。看一下下表中的第一列,记住流是由cons
和所有x
的构建的
x y z
--------
1 2 3
2 3 6
3 6 11
6 11 20
11 20 37
返回一个由数字和函数组成的列表。在第一次调用后,该函数与您通过调用获得的函数相同(神秘2 3 6)它是如何工作的?cons只是列出了它的两个参数,在本例中,这两个参数是一个值和评估lambda函数的结果,lambda函数本身就是一个函数