【问题标题】:streams in racket球拍中的流
【发布时间】:2012-10-14 03:19:24
【问题描述】:

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

我知道流是一个无限的值序列,我学习对它们进行编程的方法是将它们表示为一个 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 之间交替,但我对如何构造它有点困惑

【问题讨论】:

标签: scheme racket


【解决方案1】:

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

这是一个例子:

#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))

【讨论】:

    【解决方案2】:

    为了大致了解 Scheme 中的流,我推荐 SICP 书中的 §3.5 Streams 部分。它将教您解决与流相关的问题(例如问题中的问题)的基本概念。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-11-22
          • 2019-09-30
          • 2020-06-19
          • 1970-01-01
          • 1970-01-01
          • 2021-02-07
          • 2021-12-21
          • 1970-01-01
          • 2020-04-01
          相关资源
          最近更新 更多