The nondeterminism package

[Tags:lgpl, library, test]

Nondeterministic computations

[Skip to Readme]


Versions 1.0, 1.2, 1.4
Dependencies base (>=3 && <5), containers, mtl (>=2) [details]
License LGPL
Author Andrei Barbu <>
Maintainer Andrei Barbu <>
Stability Unknown
Category Control, AI, Constraints, Failure, Monads
Source repository head: git clone
Uploaded Mon Oct 19 18:20:24 UTC 2015 by AndreiBarbu
Distributions NixOS:1.4
Downloads 530 total (9 in the last 30 days)
1 []
Status Docs available [build log]
Last success reported on 2015-10-19 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for nondeterminism

Readme for nondeterminism-1.4


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