Various Haskell 2010 stream comonads.
* Data.Stream.Future
provides a coinductive anti-causal stream, or non-empty ZipList
. The comonad provides access to only the
tail of the stream. Like a conventional ZipList
, this is not a monad.
data Future a = Last a | a :< Future a
Data.Stream.Future.Skew
provides a non-empty skew-binary random-access-list with the semantics of Data.Stream.Future
. As with
Data.Stream.Future
this stream is not a Monad
, since the Applicative
instance zips streams of potentially differing lengths.
The random-access-list structure provides a number of operations logarithmic access time, but makes Data.Stream.Future.Skew.cons
less productive. Where applicable Data.Stream.Infinite.Skew
may be more efficient, due to a lazier and more efficient Applicative
instance.
Data.Stream.Infinite
provides a coinductive infinite anti-causal stream. The Comonad
provides access to the tail of the
stream and the Applicative
zips streams together. Unlike Future
, infinite stream form a Monad
. The monad diagonalizes
the Stream
, which is consistent with the behavior of the Applicative
, and the view of a Stream
as a isomorphic to the reader
monad from the natural numbers. Being infinite in length, there is no Alternative
instance.
data Stream a = a :< Stream a
Data.Stream.Infinite.Skew
provides an infinite skew-binary random-access-list with the semantics of Data.Stream.Infinite
Since every stream is infinite, the Applicative
instance can be considerably less strict than the corresponding instance for
Data.Stream.Future.Skew
and performs asymptotically better.
data Zipper a = !Integer :~ (Integer -> a)