这种流的实现如何工作?

时间:2014-10-22 21:40:26

标签: stream scheme racket

我完全不熟悉Scheme,函数式编程,特别是流。以下流中的前五个整数是什么?

(define (mystery x y z)
  (cons x
        (lambda ()
          (mystery y z (+ x y z)))))

(mystery 1 2 3)

这是如何工作的,我如何在Racket中使用它?

2 个答案:

答案 0 :(得分:2)

我们可以通过实现一个消耗给定数量元素并在列表中返回它们的过程来检查无限流的内容,例如:

(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 正在构建流:

{{1}}

答案 1 :(得分:1)

这将返回一个由数字和函数组成的列表。功能是 - 在第一次通话后 - 与您通过呼叫获得的相同(神秘2 3 6) 它是如何工作的? cons只是列出了它的两个参数,在这种情况下是一个值和评估lambda函数的结果,它本身就是一个函数