Description
A monad and monad transformer for nondeterministic computations.
Description
Nondeterministic computations
README.md
Nondeterminism
This package is available via Hackage where its documentation resides.
This provides nondeterministic computations in Haskell. It implements an Amb
monad in which you can perform nondeterministic choices along with a monad transformer version, AmbT
.
Amb
An example which finds Pythagorean triplets up to a certain size, project Euler problem 9.
import Control.Monad
import Control.Monad.Amb
pyTriple :: (Num t, Ord t) => t -> Amb r (t, t, t)
pyTriple n = do a <- anIntegerBetween 1 n
b <- anIntegerBetween (a + 1) n
c <- anIntegerBetween (b + 1) n
when (a*a + b*b /= c*c) empty
return (a,b,c)
length $ allValues $ pyTriple 100
More examples can be found in tests/test.hs
.
Future
- allValues is not lazy in its return value.