| Portability | portable |
|---|---|
| Stability | experimental |
| Maintainer | Luke Palmer <lrpalmer@gmail.com> |
Control.Monad.Omega
Description
A monad for enumerating sets: like the list monad, but "breadth-first".
It addresses the problem seen when trying to generate
the list of all pairs of naturals with
[ (x,y) | x <- [0..], y <- [0..] ], which is broken
since the first element of every reachable pair will
be 0.
Using Omega this can be written
pairs = runOmega $ do
x <- each [0..]
y <- each [0..]
return (x,y)
More precisely, if x appears at a finite index in
xs, and y appears at a finite index in f x,
then y will appear at a finite index in
each xs >>= f.