谁能帮助我更好地了解如何编写一个流?
据我所知,一个流是值的无限序列和所学编程它们是其表示为一个thunk调用时产生一对(1)的第一个元素的一个表示序列和(2)一个thunk的方式流为第二贯通无穷元件
例如:
(define powers-of-two
(letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
(lambda () (f 2))))
我知道在这里,它只是生产大国的两个访问这些例如调用(car (powers-of-two))
会导致2
和调用(car ((cdr (powers-of-two))))
将导致4
现在我想写一个叫做流red-blue
的字符串之间交替red
和blue
,但我有点困惑如何构建它
对于方案中的数据流的一个大致的了解,我建议部分3.5节流在SICP书。 它会教你的基本概念,以解决流相关的问题,如一个在问题。
就问题的问题,下面就来解决这个问题的总体思路:
- 建两个无限流,一个只生产了字符串
"red"
和其他"blue"
- 结合两个流以从一个一个元件和另一个(交替)然后一个元件,此过程称为
interleave
在SICP
它看起来像你问如何使用的thunk,这人已经回答了构建自己的定制流。 以防万一,这是值得注意的球拍有一个流库内置的最诈骗者会利用它来进行流。
下面是一个例子:
#lang racket
(require racket/stream)
(define reds (stream-cons "red" reds))
(define red-blues (stream-add-between reds "blue"))
;; show ten of them
(for ([i 10] [e (in-stream red-blues)])
(displayln e))
我写SRFI-41 ,它描述流,提供了一个实现,并给出了很多例子。 流有不同于SICP不同,是一种方式“更好”的SRFI解释。
我在这一个新手,但下面的解决方案似乎工作,以及:
(define red-then-blue
(letrec ([f (lambda (x) (cons x(lambda ()(f(cond [(string=? x "red") "blue"]
["red"])))))])
(lambda () (f "red"))))