2013-02-20 58 views
3

in-range在Racket中返回一個流。在racket/stream庫的流上定義了很多功能。不過,我不能使用srfi/41上的功能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個物品而無需重新發明輪子?

球拍5.3.3

回答

5

是,那種流,其(in-range 10)產生的是從srfi/41流的不同。一般來說,您不能指望srfi/41函數在Racket中的所有數據流上工作,因爲Racket「數據流」實際上是一種通用數據類型,可分派到不同的方法實現(請參閱gen:stream)。相比之下,srfi/41僅預期其自己的數據類型。

如果你想要採取10項來自racket/stream,使用(for/list ([x some-stream] [e 10]) x)stream-take或許應該被加入到racket/stream雖然)