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