3

in-rangein Racket はストリームを返します。racket/streamライブラリからのストリームで定義された関数がたくさんあります。stream-takeただし、それらから関数を使用することはできませんsrfi/41。実行したかった

(stream-take 5 (in-range 10))

それは不平を言ったstream-take: non-stream argument

(stream->list (stream-cons 10 (in-range 10)))

上記は次のエラーをスローします。

stream-promise: contract violation;
 given value instantiates a different structure type with the same name
  expected: stream?
  given: #<stream>

でも:

(stream->list (stream-cons 10 stream-null)) ;; works
(stream->list (stream-cons 10 empty-stream)) ;; works

どちらも正常に動作します。

racket/stream上記は、とからのストリームsrfi/41が互換性がないことを意味しますか? racket/stream車輪を再発明せずにストリームから 10 個のアイテムを取得するにはどうすればよいですか?

ラケット 5.3.3

4

1 に答える 1

5

はい、(in-range 10)生成されるストリームの種類はストリームとは異なりsrfi/41ます。srfi/41一般に、Racketの「ストリーム」は実際にはさまざまなメソッド実装にディスパッチするジェネリックデータ型であるため、関数がRacketのすべてのストリームで機能することを期待することはできません(を参照gen:stream)。対照的に、srfi/41それ自体のデータ型のみを期待します。

stream-takeおそらく追加する必要がracket/streamあります)

から10個のアイテムを取得する場合はracket/stream、を使用します(for/list ([x some-stream] [e 10]) x)

于 2013-02-20T14:23:00.257 に答える