8

誰かが私がストリームを書く方法をよりよく理解するのを手伝ってくれる?

ストリームは値の無限のシーケンスであり、それらのプログラミングを学んだ方法は、呼び出されたときに(1)シーケンスの最初の要素と(2)を表すサンクのペアを生成するサンクとしてそれらを表すことであることを理解しています2番目から無限大の要素のストリーム

例えば:

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

私はここで、それが2の累乗を生成していることを理解しています。たとえば、これらにアクセスすると、呼び出しは4(car (powers-of-two))2なり、呼び出し(car ((cdr (powers-of-two))))は4になります。

今、私は文字列をred-blue交互に繰り返すというストリームを書き込もうとしていますが、それを構築する方法について少し混乱していますredblue

4

4 に答える 4

14

他の人がすでに答えているサンクを使って独自のカスタムストリームを構築する方法を尋ねていたようです。念のため、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))
于 2012-10-24T15:13:29.340 に答える
6

スキームのストリームの一般的な理解については、SICPブックのセクション§3.5ストリームをお勧めします。問題のようなストリーム関連の問題を解決するための基本的な概念を説明します。

問題の問題に関して、これを解決するための一般的な考え方は次のとおりです。

  • 2つの無限ストリームを構築します。1つは文字列のみを生成し、もう1つ"red""blue"
  • 1つの要素を一方から取得し、次に一方の要素をもう一方から取得する(交互に)両方のストリームを結合します。この手順はinterleaveSICPで呼び出されます
于 2012-10-24T05:10:36.330 に答える
6

ストリームを記述し、実装を提供し、多くの例を示すSRFI -41を作成しました。そこでのストリームはSICPのストリームとは異なり、SRFIで説明されている方法で「より優れています」。

于 2012-10-24T12:41:26.253 に答える
1

私はこれの初心者ですが、次の解決策もうまくいくようです:

 (define red-then-blue
   (letrec ([f (lambda (x) (cons x(lambda ()(f(cond [(string=? x "red") "blue"]
                                              ["red"])))))])
   (lambda () (f "red"))))
于 2013-02-23T08:46:00.193 に答える