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
> 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
- "Data.Stream.Infinite.Functional.Zipper" provides a bi-infinite sequence,
represented as a pure function with an accumulating parameter added to optimize
moving the current focus.
> data Zipper a = !Integer :~ (Integer -> a)
- "Data.Stream.Supply" provides a comonadic supply of unique values, which are
generated impurely as the tree is explored.