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

时间:2013-02-20 12:32:52

标签: stream racket

Racket中的

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/streamsrfi/41的流不兼容?如何在不重新发明轮子的情况下从racket/stream流中获取10个项目?

Racket 5.3.3

1 个答案:

答案 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)