Stability | experimental |
---|---|

Maintainer | conal@conal.net |

Unambiguous choice

For non-flat types (where values may be partially defined, rather than necessarily bottom or fully defined) and information merging, see the lub package, http://haskell.org/haskellwiki/Lub.

See unamb.cabal for the list of contributors.

- unamb :: a -> a -> a
- unambs :: [a] -> a
- assuming :: Bool -> a -> a
- asAgree :: Eq a => a -> a -> a
- parCommute :: (a -> a -> b) -> a -> a -> b
- parIdentity :: Eq a => (a -> a -> a) -> a -> a -> a -> a
- parAnnihilator :: Eq a => (a -> a -> a) -> a -> a -> a -> a
- por :: Bool -> Bool -> Bool
- pand :: Bool -> Bool -> Bool
- pmin :: (Ord a, Bounded a) => a -> a -> a
- pmax :: (Ord a, Bounded a) => a -> a -> a
- pmult :: Num a => a -> a -> a
- amb :: a -> a -> IO a
- race :: IO a -> IO a -> IO a
- data BothBottom

# Purely functional unambiguous choice

Unambiguous choice operator. Equivalent to the ambiguous choice
operator, but with arguments restricted to be equal where not bottom,
so that the choice doesn't matter. See also `amb`

.

If anything kills unamb while it is evaluating (like nested unambs), it can be retried later but, unlike most functions, work may be lost.

# Some useful special applications of `unamb`

parCommute :: (a -> a -> b) -> a -> a -> bSource

Turn a binary commutative operation into that tries both orders in
parallel. Useful when there are special cases that don't require
evaluating both arguments. For non-flat types and information merging,
see `parCommute`

in the `lub`

package.

parIdentity :: Eq a => (a -> a -> a) -> a -> a -> a -> aSource

parAnnihilator :: Eq a => (a -> a -> a) -> a -> a -> a -> aSource

# Some related imperative tools

race :: IO a -> IO a -> IO aSource

Race two actions against each other in separate threads, and pick
whichever finishes first. See also `amb`

.

# Exception thrown if neither value evaluates

data BothBottom Source

Use a particular exception as our representation for waiting forever.