SRFI/41和Racket/stream有什么不同?

Mir*_*lov 3 stream racket

in-range在Racket中返回一个流.在racket/stream库中的流上定义了大量函数.但是我不能使用功能stream-takesrfi/41他们.我想执行

(stream-take 5 (in-range 10))
Run Code Online (Sandbox Code Playgroud)

它抱怨说stream-take: non-stream argument.

(stream->list (stream-cons 10 (in-range 10)))
Run Code Online (Sandbox Code Playgroud)

以上引发了以下错误:

stream-promise: contract violation;
 given value instantiates a different structure type with the same name
  expected: stream?
  given: #<stream>
Run Code Online (Sandbox Code Playgroud)

然而:

(stream->list (stream-cons 10 stream-null)) ;; works
(stream->list (stream-cons 10 empty-stream)) ;; works
Run Code Online (Sandbox Code Playgroud)

两者都很好.

以上是否意味着来自racket/streamsrfi/41不兼容的流?如何在racket/stream不重新发明轮子的情况下从流中获取10个项目?

球拍5.3.3

Asu*_*awa 5

是的,(in-range 10)产生的流类型与流不同srfi/41.通常,您不能指望srfi/41函数可以在Racket中的所有流上工作,因为Racket"stream"实际上是一种分发给不同方法实现的通用数据类型(请参阅参考资料gen:stream).相反,srfi/41只需要自己的数据类型.

(虽然stream-take应该加入racket/stream)

如果您想拍摄10件物品racket/stream,请使用(for/list ([x some-stream] [e 10]) x).