【发布时间】:2013-01-08 09:57:06
【问题描述】:
如何在 Scheme 中通过 stream-map 定义整数:
(定义整数 (stream-cons 1 (stream-map *something* *something*))
【问题讨论】:
标签: stream scheme racket sicp lazy-sequences
如何在 Scheme 中通过 stream-map 定义整数:
(定义整数 (stream-cons 1 (stream-map *something* *something*))
【问题讨论】:
标签: stream scheme racket sicp lazy-sequences
(define integers
(stream-cons 1
(stream-map add1 integers)))
有关流的更多信息,请参阅SRFI-41。
【讨论】:
@user448810 的答案是完美的,它将在 Racket 中工作(它使用特定于 Racket 的程序)。但是这个问题也被标记为SICP,所以这是我的两分钱。
仅使用 SICP 中可用的 Scheme 过程的子集来回答问题会产生等效但略有不同的解决方案,仅使用书中定义的以下原始流操作:stream-null? stream-cons stream-car stream-cdr。特别注意stream-map不是Scheme的标准部分,在书中它是根据原始操作实现的,比Racket的实现有一个优势——它可以接收可变数量的流作为参数:
(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)))
【讨论】:
您也可以使用 SICP 中的示例:
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define nats (integers-starting-from 1))
【讨论】: