Proposal: Data.Stream

Roman Leshchinskiy rl at
Thu Jul 12 03:43:39 EDT 2007

Wouter Swierstra wrote:
>>> I'm in favour of starting a separate stream library, and I would
>>> expect it to diverge from the list library over time.
>> I agree: this should probably be a separate library for now, until we
>> see how far it grows. There's an awful lot of other things not in base:
>> queues, difference lists, comonads, that live outside base, and I'm not
>> sure there's a strong enough case yet that this should go into base.
> I think you're taking Conor's quote out of context. If I understand it 
> correctly, he's replying to Neil Mitchell's post; he is arguing for a 
> separate library different from Data.List. I don't think he objects to 
> including it in base.
> Conor makes a strong case for separating lists and streams: they are 
> different types, with fundamentally different properties. I don't claim 
> that the proposed Stream library is the final word on the subject, but 
> it is a theoretically solid and the content is completely 
> uncontroversial. If nothing else, it is a starting point for encouraging 
> more coinductive Haskell programming. For that reason, I'd argue for 
> including it in the standard distribution.

In general, I don't think there is a "standard" definition of a stream 
datatype. IIUC, you see streams as necessarily infinite but there are 
other perfectly valid interpretations. Stream is simply a very broad 
term which means too many different things. In particular, I don't see 
why our Stream data type doesn't model streams. Anyway, IMHO to avoid 
confusion we shouldn't have a standard stream type at all. And, as 
Stefan O'Rear has pointed out, a non-base package probably shouldn't put 
its modules under Data (unless, perhaps, it is under Data.<package>); in 
any case, the package name should appear somewhere in the path.

> I am not too concerned whether or not this library should go into base 
> or a separate package. I'd be happy to settle for Codata.Stream. This is 
> easy to separate from base and does not cause any conflicts. Other 
> libraries can be added to the Codata package, as we see fit.
> I would argue against calling the ByteString package Data.Stream. As 
> tempting as it may be, the package is not about streams, but colists.

I have to admit that I don't really understand the distinction between 
Haskell's lists and colists (or, in general, datatypes in Haskell and 
codatatypes). To me, lists are inductive and colists are coinductive, 
i.e., the former are the least and the latter the greatest fixed point 
of the underlying functor. Thus, Haskell's list datatype actually models 
colists (and algebraic datatypes in Haskell are coinductive by default). 
This thread seems to implicitly assume a different interpretation of the 
prefix "co" but I don't really understand what this interpretation is.

As to Data.Stream, I don't think that the ByteString library actually 
includes a module with that name  Our stream fusion based list library 
does but that's really quite experimental and not really released, I 
think. However, our streams will have to go into base at some point as 
they are already used by the ByteString and NDP packages (even though 
each has its own copy) and we plan on using them for Data.Array and 
friends as well. The module doesn't really have to be called 
Data.Stream, though.


More information about the Libraries mailing list