in-range在Racket中返回一个流.在racket/stream库中的流上定义了大量函数.但是我不能使用功能stream-take从srfi/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/stream和srfi/41不兼容的流?如何在racket/stream不重新发明轮子的情况下从流中获取10个项目?
球拍5.3.3
是的,(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).