Safe Haskell | None |
---|
Data.Stream
Contents
Description
Streams are infinite lists. Most operations on streams are completely analogous to the definition in Data.List.
- data Stream a = Cons a (Stream a)
- (<:>) :: a -> Stream a -> Stream a
- head :: Stream a -> a
- tail :: Stream a -> Stream a
- inits :: Stream a -> Stream [a]
- tails :: Stream a -> Stream (Stream a)
- map :: (a -> b) -> Stream a -> Stream b
- intersperse :: a -> Stream a -> Stream a
- interleave :: Stream a -> Stream a -> Stream a
- scan :: (a -> b -> a) -> a -> Stream b -> Stream a
- scan' :: (a -> b -> a) -> a -> Stream b -> Stream a
- scan1 :: (a -> a -> a) -> Stream a -> Stream a
- scan1' :: (a -> a -> a) -> Stream a -> Stream a
- transpose :: Stream (Stream a) -> Stream (Stream a)
- iterate :: (a -> a) -> a -> Stream a
- repeat :: a -> Stream a
- cycle :: [a] -> Stream a
- unfold :: (c -> (a, c)) -> c -> Stream a
- take :: Int -> Stream a -> [a]
- drop :: Int -> Stream a -> Stream a
- splitAt :: Int -> Stream a -> ([a], Stream a)
- takeWhile :: (a -> Bool) -> Stream a -> [a]
- dropWhile :: (a -> Bool) -> Stream a -> Stream a
- span :: (a -> Bool) -> Stream a -> ([a], Stream a)
- break :: (a -> Bool) -> Stream a -> ([a], Stream a)
- filter :: (a -> Bool) -> Stream a -> Stream a
- partition :: (a -> Bool) -> Stream a -> (Stream a, Stream a)
- group :: Eq a => Stream a -> Stream [a]
- isPrefixOf :: Eq a => [a] -> Stream a -> Bool
- (!!) :: Stream a -> Int -> a
- elemIndex :: Eq a => a -> Stream a -> Int
- elemIndices :: Eq a => a -> Stream a -> Stream Int
- findIndex :: (a -> Bool) -> Stream a -> Int
- findIndices :: (a -> Bool) -> Stream a -> Stream Int
- zip :: Stream a -> Stream b -> Stream (a, b)
- zipWith :: (a -> b -> c) -> Stream a -> Stream b -> Stream c
- unzip :: Stream (a, b) -> (Stream a, Stream b)
- zip3 :: Stream a -> Stream b -> Stream c -> Stream (a, b, c)
- zipWith3 :: (a -> b -> c -> d) -> Stream a -> Stream b -> Stream c -> Stream d
- unzip3 :: Stream (a, b, c) -> (Stream a, Stream b, Stream c)
- words :: Stream Char -> Stream String
- unwords :: Stream String -> Stream Char
- lines :: Stream Char -> Stream String
- unlines :: Stream String -> Stream Char
- toList :: Stream a -> [a]
- fromList :: [a] -> Stream a
The type of streams
data Stream a
An infinite sequence.
Beware: If you use any function from the Eq
or Ord
class to compare two equal streams, these functions will diverge.
Instances
Monad Stream | |
Functor Stream | |
Applicative Stream | |
Eq a => Eq (Stream a) | |
Ord a => Ord (Stream a) | |
Show a => Show (Stream a) | A Show instance for Streams that takes the right associativity into
account and so doesn't put parenthesis around the tail of the Stream.
Note that |
Arbitrary a => Arbitrary (Stream a) | |
CoArbitrary a => CoArbitrary (Stream a) | |
Serial a => Serial (Stream a) |
Basic functions
tails :: Stream a -> Stream (Stream a)
The tails
function takes a stream xs
and returns all the
suffixes of xs
.
Stream transformations
intersperse :: a -> Stream a -> Stream a
intersperse
y
xs
creates an alternating stream of
elements from xs
and y
.
interleave :: Stream a -> Stream a -> Stream a
Interleave two Streams xs
and ys
, alternating elements
from each list.
[x1,x2,...] `interleave` [y1,y2,...] == [x1,y1,x2,y2,...]
scan :: (a -> b -> a) -> a -> Stream b -> Stream a
scan
yields a stream of successive reduced values from:
scan f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
transpose :: Stream (Stream a) -> Stream (Stream a)
transpose
computes the transposition of a stream of streams.
Building streams
iterate :: (a -> a) -> a -> Stream a
iterate
f
x
function produces the infinite sequence
of repeated applications of f
to x
.
iterate f x = [x, f x, f (f x), ..]
cycle
xs
returns the infinite repetition of xs
:
cycle [1,2,3] = Cons 1 (Cons 2 (Cons 3 (Cons 1 (Cons 2 ...
unfold :: (c -> (a, c)) -> c -> Stream a
The unfold function is similar to the unfold for lists. Note there is no base case: all streams must be infinite.
Extracting sublists
take :: Int -> Stream a -> [a]
take
n
xs
returns the first n
elements of xs
.
Beware: passing a negative integer as the first argument will cause an error.
drop :: Int -> Stream a -> Stream a
drop
n
xs
drops the first n
elements off the front of
the sequence xs
.
Beware: passing a negative integer as the first argument will cause an error.
splitAt :: Int -> Stream a -> ([a], Stream a)
The splitAt
function takes an integer n
and a stream xs
and returns a pair consisting of the prefix of xs
of length
n
and the remaining stream immediately following this prefix.
Beware: passing a negative integer as the first argument will cause an error.
takeWhile :: (a -> Bool) -> Stream a -> [a]
takeWhile
p
xs
returns the longest prefix of the stream
xs
for which the predicate p
holds.
span :: (a -> Bool) -> Stream a -> ([a], Stream a)
span
p
xs
returns the longest prefix of xs
that satisfies
p
, together with the remainder of the stream.
filter :: (a -> Bool) -> Stream a -> Stream a
filter
p
xs
, removes any elements from xs
that do not satisfy p
.
Beware: this function may diverge if there is no element of
xs
that satisfies p
, e.g. filter odd (repeat 0)
will loop.
partition :: (a -> Bool) -> Stream a -> (Stream a, Stream a)
The partition
function takes a predicate p
and a stream
xs
, and returns a pair of streams. The first stream corresponds
to the elements of xs
for which p
holds; the second stream
corresponds to the elements of xs
for which p
does not hold.
Beware: One of the elements of the tuple may be undefined. For
example, fst (partition even (repeat 0)) == repeat 0
; on the
other hand snd (partition even (repeat 0))
is undefined.
group :: Eq a => Stream a -> Stream [a]
The group
function takes a stream and returns a stream of
lists such that flattening the resulting stream is equal to the
argument. Moreover, each sublist in the resulting stream
contains only equal elements. For example,
group $ cycle "Mississippi" = "M" ::: "i" ::: "ss" ::: "i" ::: "ss" ::: "i" ::: "pp" ::: "i" ::: "M" ::: "i" ::: ...
Sublist predicates
isPrefixOf :: Eq a => [a] -> Stream a -> Bool
The isPrefix
function returns True
if the first argument is
a prefix of the second.
Indexing streams
xs !! n
returns the element of the stream xs
at index
n
. Note that the head of the stream has index 0.
Beware: passing a negative integer as the first argument will cause an error.
elemIndices :: Eq a => a -> Stream a -> Stream Int
The elemIndices
function extends elemIndex
, by returning the
indices of all elements equal to the query element, in ascending order.
Beware: elemIndices
x
xs
will diverge if any suffix of
xs
does not contain x
.
findIndices :: (a -> Bool) -> Stream a -> Stream Int
The findIndices
function extends findIndex
, by returning the
indices of all elements satisfying the predicate, in ascending
order.
Beware: findIndices
p
xs
will diverge if all the elements
of any suffix of xs
fails to satisfy p
.
Zipping and unzipping streams
zip :: Stream a -> Stream b -> Stream (a, b)
The zip
function takes two streams and returns the stream of
pairs obtained by pairing elements at the same position in both
argument streams.
Functions on streams of characters
words :: Stream Char -> Stream String
The words
function breaks a stream of characters into a
stream of words, which were delimited by white space.
Beware: if the stream of characters xs
does not contain white
space, accessing the tail of words xs
will loop.
lines :: Stream Char -> Stream String
The lines
function breaks a stream of characters into a list
of strings at newline characters. The resulting strings do not
contain newlines.
Beware: if the stream of characters xs
does not contain
newline characters, accessing the tail of lines xs
will loop.