流的这个实现是如何工作的



我对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函数本身就是一个函数

相关内容

  • 没有找到相关文章