Data.Lub
 Stability experimental Maintainer conal@conal.net
 Contents Least upper bounds Some useful special applications of lub
Description
Compute least upper bound (lub) of two values, with respect to information content. I.e., merge the information available in each. For flat types (in which all values are either bottom or fully defined), lub is equivalent to unamb.
Synopsis
class HasLub a where
 lub :: a -> a -> a
flatLub :: a -> a -> a
parCommute :: HasLub b => (a -> a -> b) -> a -> a -> b
ptimes :: (HasLub a, Num a) => a -> a -> a
Least upper bounds
 class HasLub a where Source
Types that support information merging (lub)
Methods
 lub :: a -> a -> a Source
Least upper information bound. Combines information available from each argument. The arguments must be consistent, i.e., must have a common upper bound.
Instances
 HasLub Bool HasLub Char HasLub Double HasLub Float HasLub Int HasLub Integer HasLub () HasLub a => HasLub ([] a) HasLub a => HasLub (Maybe a) HasLub b => HasLub (a -> b) (HasLub a, HasLub b) => HasLub (Either a b) (HasLub a, HasLub b) => HasLub ((,) a b)
 flatLub :: a -> a -> a Source

A lub for flat domains. Equivalent to unamb. Handy for defining HasLub instances, e.g.,

```   instance HasLub Integer where lub = flatLub
```
Some useful special applications of lub
 parCommute :: HasLub b => (a -> a -> b) -> a -> a -> b Source

Turn a binary commutative operation into that tries both orders in parallel, lub-merging the results. Useful when there are special cases that don't require evaluating both arguments.

Similar to parCommute, but uses lub instead of unamb.

 ptimes :: (HasLub a, Num a) => a -> a -> a Source
Multiplication optimized for either argument being zero or one, where the other might be expensive/delayed.