5

如何通过 Scheme 中的流映射定义整数:

(定义整数 (stream-cons 1 (stream-map *something* *something*))
4

3 回答 3

4

@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)))
于 2013-01-24T15:54:36.180 回答
4
(define integers
  (stream-cons 1
    (stream-map add1 integers)))

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

于 2013-01-24T15:31:23.303 回答
0

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

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

(define nats (integers-starting-from 1))
于 2015-04-23T23:48:22.163 回答