nondeterminism: A monad and monad transformer for nondeterministic computations.

[ ai, constraints, control, failure, library, monads ] [ Propose Tags ]

Nondeterministic computations

[Skip to Readme]




Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 1.0, 1.2, 1.4, 1.5
Dependencies base (>=3 && <5), containers, mtl (>=2) [details]
License LicenseRef-LGPL
Author Andrei Barbu <>
Maintainer Andrei Barbu <>
Category Control, AI, Constraints, Failure, Monads
Source repo head: git clone
Uploaded by AndreiBarbu at 2015-10-19T18:20:24Z
Distributions LTSHaskell:1.5, NixOS:1.5, Stackage:1.5
Reverse Dependencies 2 direct, 0 indirect [details]
Downloads 3132 total (13 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2015-10-19 [all 1 reports]

Readme for nondeterminism-1.4

[back to package description]


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.


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.


  • allValues is not lazy in its return value