3

in-range在 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 回答