在球拍流(streams in racket)

2019-07-02 10:40发布

谁能帮助我更好地了解如何编写一个流?

据我所知,一个流是值的无限序列和所学编程它们是其表示为一个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的字符串之间交替redblue ,但我有点困惑如何构建它

Answer 1:

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

就问题的问题,下面就来解决这个问题的总体思路:

  • 建两个无限流,一个只生产了字符串"red"和其他"blue"
  • 结合两个流以从一个一个元件和另一个(交替)然后一个元件,此过程称为interleave在SICP


Answer 2:

它看起来像你问如何使用的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))


Answer 3:

我写SRFI-41 ,它描述流,提供了一个实现,并给出了很多例子。 流有不同于SICP不同,是一种方式“更好”的SRFI解释。



Answer 4:

我在这一个新手,但下面的解决方案似乎工作,以及:

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


文章来源: streams in racket
标签: scheme racket