nondeterminism: A monad and monad transformer for nondeterministic computations.

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

Nondeterministic computations

[Skip to Readme]


[Index] [Quick Jump]


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 2022-05-20T01:00:52Z
Distributions LTSHaskell:1.5, NixOS:1.5, Stackage:1.5
Reverse Dependencies 2 direct, 0 indirect [details]
Downloads 3241 total (23 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 2022-05-20 [all 1 reports]

Readme for nondeterminism-1.5

[back to package description]


Build Status

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