如何通过 Scheme 中的流映射定义整数:
(定义整数 (stream-cons 1 (stream-map *something* *something*))
如何通过 Scheme 中的流映射定义整数:
(定义整数 (stream-cons 1 (stream-map *something* *something*))
@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)))
(define integers
(stream-cons 1
(stream-map add1 integers)))
有关流的更多信息,请参见SRFI-41。
您还可以使用 SICP 中的示例:
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define nats (integers-starting-from 1))