in-range
返回一个流。在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个项目?
Racket 5.3.3
答案 0 :(得分:5)
是的,(in-range 10)
产生的流类型与srfi/41
流不同。通常,您不能期望srfi/41
函数在Racket中的所有流上工作,因为Racket“stream”实际上是一种分发给不同方法实现的通用数据类型(请参阅gen:stream
)。相反,srfi/41
只需要自己的数据类型。
(stream-take
可能应添加到racket/stream
但
如果您想从racket/stream
中选择10个项目,请使用(for/list ([x some-stream] [e 10]) x)
。