streams in racket

元气小坏坏 提交于 2019-11-30 03:28:09

问题


Can anyone help me better understand how to write a stream?

I understand that a stream is an infinite sequence of values and the way I have learned programming them is a representing them as a thunk that when called produces a pair of (1) the first element in the sequence and (2) a thunk that represents the stream for the second-through-infinity elements

For example:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))

I understand here that it is just producing a powers of two and to access these for example calling (car (powers-of-two)) would result in 2 and calling (car ((cdr (powers-of-two)))) would result in 4

Now I am trying to write a stream called red-blue that alternates between strings red and blue but I am a little confused about how to construct it


回答1:


For a general understanding of streams in Scheme, I'd recommend section §3.5 Streams in the SICP book. It'll teach you the basic concepts to solve stream-related problems such as the one in the question.

Regarding the problem in the question, here's the general idea to solve it:

  • Build two infinite streams, one producing only the string "red" and the other "blue"
  • Combine both streams taking one element from one and then one element from the other (alternating), this procedure is called interleave in SICP



回答2:


It looks like you were asking how to build your own custom streams with thunks, which others have already answered. Just in case, it's worth noting that Racket has a stream library built-in and most Racketeers would use that for streams.

Here's an example:

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



回答3:


I wrote SRFI-41 which describes streams, provides an implementation, and gives many examples. The streams there differ from those in SICP, and are "better" in a way explained in the SRFI.




回答4:


I am a newbie at this but the following solutions seems to work as well:

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


来源:https://stackoverflow.com/questions/13043207/streams-in-racket

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!