Streams are infinite lists. Most operations on streams are completely analogous to the definition in Data.List.

- data Stream a = Cons a (Stream a)
- head :: Stream a -> a
- tail :: Stream a -> Stream a
- map :: (a -> b) -> Stream a -> Stream b
- intersperse :: a -> Stream a -> 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 :: (Num a, Ord a) => a -> Stream a1 -> Stream a1
- 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)
- isPrefixOf :: Eq a => [a] -> Stream a -> Bool
- (!!) :: Int -> Stream a -> a
- 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)
- words :: Stream Char -> Stream String
- unwords :: Stream String -> Stream Char
- lines :: Stream Char -> Stream String
- unlines :: Stream String -> Stream Char
- listToStream :: [a] -> Stream a
- streamToList :: Stream a -> [a]

# The type of streams

An infinite sequence.

# Basic functions

# Stream transformations

map :: (a -> b) -> Stream a -> Stream bSource

Apply a function uniformly over all elements of a sequence.

intersperse :: a -> Stream a -> Stream aSource

# Building streams

iterate :: (a -> a) -> a -> Stream aSource

`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 :: [a] -> Stream aSource

`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 aSource

The unfold function is similar to the unfold for lists. Note there is no base case: all streams must be infinite.

# Extracting sublists

splitAt :: Int -> Stream a -> ([a], Stream a)Source

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.

span :: (a -> Bool) -> Stream a -> ([a], Stream a)Source

`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 aSource

`filter`

`p`

`xs`

, removes any elements from `xs`

that do not satisfy `p`

.

partition :: (a -> Bool) -> Stream a -> (Stream a, Stream a)Source

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.

# Sublist predicates

isPrefixOf :: Eq a => [a] -> Stream a -> BoolSource

The `isPrefix`

function returns `True`

if the first argument is a prefix of the second.

# Indexing streams

(!!) :: Int -> Stream a -> aSource

`xs !! n`

returns the element of the stream `xs`

at index
`n`

. Note that the head of the stream has index 0.

# Zipping and unzipping streams

zip :: Stream a -> Stream b -> Stream (a, b)Source

The `zip`

function takes two streams and returns a list of corresponding pairs.

# Functions on streams of characters

words :: Stream Char -> Stream StringSource

The `words`

function breaks a stream of characters into a stream of words,
which were delimited by white space.

lines :: Stream Char -> Stream StringSource

The `lines`

function breaks a stream of characters into a list
of strings at newline characters. The resulting strings do not
contain newlines.

# Converting to and from an infinite list

listToStream :: [a] -> Stream aSource

The `listToStream`

converts an infinite list to a
stream. Passing a finite list will result in an error.

streamToList :: Stream a -> [a]Source

The `streamToList`

converts a stream into an infinite list.