球拍流

时间:2012-10-24 04:51:56

标签: scheme racket

任何人都可以帮助我更好地了解如何编写流吗?

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

例如:

(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 个答案:

答案 0 :(得分:14)

看起来你问的是如何使用thunks构建自己的自定义流,其他人已经回答过。为了以防万一,值得注意的是,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))

答案 1 :(得分:6)

为了对Scheme中的流的一般理解,我建议在SICP书中提到§3.5 Streams部分。它将教你解决流相关问题的基本概念,例如问题中的问题。

关于问题中的问题,这是解决问题的一般想法:

  • 构建两个无限流,一个只生成字符串"red",另一个生成"blue"
  • 将两个流合并为一个元素,然后从另一个元素中取出一个元素(交替),此过程在SICP中称为interleave

答案 2 :(得分:6)

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

答案 3 :(得分:1)

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

 (define red-then-blue
   (letrec ([f (lambda (x) (cons x(lambda ()(f(cond [(string=? x "red") "blue"]
                                              ["red"])))))])
   (lambda () (f "red"))))