8

谁能帮助我更好地理解如何编写流?

我知道流是一个无限的值序列,我学习对它们进行编程的方式是将它们表示为一个 thunk,当被调用时会产生一对(1)序列中的第一个元素和(2)一个表示二次无穷大元素的流

例如:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))

我在这里理解它只是产生 2 的幂并且访问这些例如调用(car (powers-of-two))会导致2并且调用(car ((cdr (powers-of-two))))会导致 4

现在我正在尝试编写一个red-blue在字符串之间交替调用的流redblue但我对如何构造它有点困惑

4

4 回答 4

14

看起来您在问如何使用 thunk 构建自己的自定义流,其他人已经回答了。以防万一,值得注意的是,Racket 有一个内置的流库,大多数 Racketeers 都会将它用于流。

这是一个例子:

#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))
于 2012-10-24T15:13:29.340 回答
6

对于 Scheme 中的流的一般理解,我推荐SICP 书中的§3.5 Streams部分。它将教您解决与流相关的问题(例如问题中的问题)的基本概念。

关于问题中的问题,这里是解决它的一般思路:

  • 构建两个无限流,一个只产生字符串"red",另一个"blue"
  • 合并两个流,从一个元素中获取一个元素,然后从另一个元素中获取一个元素(交替),此过程interleave在 SICP 中调用
于 2012-10-24T05:10:36.330 回答
6

我编写了SRFI-41,它描述了流,提供了一个实现,并给出了许多示例。那里的流与 SICP 中的流不同,并且以 SRFI 中解释的方式“更好”。

于 2012-10-24T12:41:26.253 回答
1

我是这方面的新手,但以下解决方案似乎也有效:

 (define red-then-blue
   (letrec ([f (lambda (x) (cons x(lambda ()(f(cond [(string=? x "red") "blue"]
                                              ["red"])))))])
   (lambda () (f "red"))))
于 2013-02-23T08:46:00.193 回答