[Haskell-cafe] Re: I/O interface

Marcin 'Qrczak' Kowalczyk qrczak at knm.org.pl
Thu Jan 13 07:05:45 EST 2005


Ketil Malde <ketil+haskell at ii.uib.no> writes:

> It seemed to me, though, that streams are related to channels,

I'm not sure what exactly do you mean by streams (because they are
only being designed), but differences are:

- A stream is either an input stream or an output stream, while a
  single channel supports reading from one end and writing to the
  other end.

- A stream passes around bytes, which are usually grouped in blocks
  for efficiency. A channel is polymorphic wrt. the element type and
  elements are always processed one by one.

- A stream may be backed by an OS file, pipe, socket etc., while
  a channel exists purely in Haskell.

- A channel is never closed. Reading more data than have been put
  blocks until someone puts more data. A stream can reach its end,
  which is a condition a reader can detect. A stream backed by a pipe
  is similar to a channel of bytes in that the reader blocks until
  someone puts more data, but it can be closed too, which causes the
  reader to observe end of file. A writer to a stream can block too
  when the internal buffer in the kernel is full.

- A stream can be inherited by child processes, and it generally
  continues to work by being linked to the same data sink or source as
  before. A channel is inherited as a whole: there is no communication
  between the two versions of the channel in the two processes.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak at knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/


More information about the Haskell-Cafe mailing list