Various instances of monads model different type of effects: for example, `Maybe` models partiality, `List` non-determinism, `Reader` read-only state. I would like to know if there is such an intuitive explanation for the monad instance of the stream data type (or infinite list or co-list), `data Stream a = Cons a (Stream a)` (see below its monad instance definition). I've stumbled upon the stream monad on a [few](http://strictlypositive.org/Idiom.pdf) [different](http://zenzike.com/posts/2010-10-21-streams-and-monad-laws) [occasions](https://patternsinfp.wordpress.com/2010/12/31/stream-monad/) and I would like to understand better its uses.

```
data Stream a = Cons a (Stream a)

instance Functor Stream where
    fmap f (Cons x xs) = Cons (f x) (fmap f xs)

instance Applicative Stream where
    pure a                      = Cons a (pure a)
    (Cons f fs) <*> (Cons a as) = Cons (f a) (fs <*> as)

instance Monad Stream where
    xs >>= f = diag (fmap f xs)

diag :: Stream (Stream a) -> Stream a
diag (Cons xs xss) = Cons (hd xs) (diag (fmap tl xss))
    where
        hd (Cons a _ ) = a
        tl (Cons _ as) = as

```

P.S.: I'm not sure if I'm very precise in my language (especially when using the word "effect"), so feel free to correct me.