球拍流

kfe*_*fem 8 scheme racket

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

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

例如:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))
Run Code Online (Sandbox Code Playgroud)

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

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

Asu*_*awa 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))
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 6

对于方案中的数据流的一个大致的了解,我建议部分3.5节流在SICP书.它将教你解决与流相关的问题的基本概念,例如问题中的问题.

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

  • 建两个无限流,一个只生产串"red"和其他"blue"
  • 将两个流组合在一起,然后从另一个元素中取出一个元素(交替),interleave在SICP中调用此过程


use*_*810 6

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