任何人都可以帮助我更好地了解如何编写流吗?
我理解一个流是一个无限的值序列,我学会编程它们的方式是将它们表示为一个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
的流,它在字符串red
和blue
之间交替,但我对如何构建它感到有点困惑
答案 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"
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"))))