Scheme中的流 - 通过方案中的流映射定义整数

时间:2013-01-24 15:24:39

标签: stream scheme racket sicp lazy-sequences

如何在Scheme中通过stream-map定义整数:

(define integers (stream-cons 1 (stream-map *something* *something*))

3 个答案:

答案 0 :(得分:4)

(define integers
  (stream-cons 1
    (stream-map add1 integers)))

有关流的更多信息,请参阅SRFI-41

答案 1 :(得分:4)

@ user448810的答案非常完美,它可以在Racket中使用(它使用特定于Racket的程序)。但问题也标有SICP,所以这是我的两分钱。

仅使用SICP中可用的Scheme子集的子集来回答问题,只使用书中定义的以下原始流操作产生一个等效但略有不同的解决方案:stream-null? stream-cons stream-car stream-cdr。特别注意stream-map不是Scheme的标准部分,并且在本书中它是基于原始操作实现的,优于Racket的实现 - 它可以接收可变数量的流作为参数:< / p>

(define (stream-map proc . args)
  (if (stream-null? (car args))
      stream-null
      (stream-cons (apply proc (map stream-car args))
                   (apply stream-map (cons proc (map stream-cdr args))))))

(define (add-streams s1 s2)
  (stream-map + s1 s2))

通过上述程序,可以轻松定义integers

(define ones (stream-cons 1
                          ones))

(define integers (stream-cons 1
                              (add-streams ones integers)))

答案 2 :(得分:0)

您也可以使用SICP中的示例:

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

(define nats (integers-starting-from 1))