Copyright | (c) Conal Elliott 2009-2012 |
---|---|
License | BSD3 |
Maintainer | conal@conal.net |
Stability | experimental |
Safe Haskell | Safe |
Language | Haskell98 |
Some classes for generalized boolean operations.
In this design, for if-then-else, equality and inequality tests, the boolean type depends on the value type.
I also tried using a unary type constructor class. The class doesn't work
for regular booleans, so generality is lost. Also, we'd probably have
to wire class constraints in like: (==*) :: Eq a => f Bool -> f a -> f
a -> f a
, which disallows situations needing additional constraints,
e.g., Show.
Starting with 0.1.0, this package uses type families. Up to version 0.0.2, it used MPTCs with functional dependencies. My thanks to Andy Gill for suggesting & helping with the change.
Synopsis
- class Boolean b where
- type family BooleanOf a
- class Boolean (BooleanOf a) => IfB a where
- boolean :: (IfB a, bool ~ BooleanOf a) => a -> a -> bool -> a
- cond :: (Applicative f, IfB a, bool ~ BooleanOf a) => f bool -> f a -> f a -> f a
- crop :: (Applicative f, Monoid (f a), IfB a, bool ~ BooleanOf a) => f bool -> f a -> f a
- class Boolean (BooleanOf a) => EqB a where
- class Boolean (BooleanOf a) => OrdB a where
- minB :: (IfB a, OrdB a) => a -> a -> a
- maxB :: (IfB a, OrdB a) => a -> a -> a
- sort2B :: (IfB a, OrdB a) => (a, a) -> (a, a)
- guardedB :: (IfB b, bool ~ BooleanOf b) => bool -> [(bool, b)] -> b -> b
- caseB :: (IfB b, bool ~ BooleanOf b) => a -> [(a -> bool, b)] -> b -> b
Documentation
Generalized boolean class
BooleanOf
computed the boolean analog of a specific type.
Instances
type BooleanOf Bool # | |
Defined in Data.Boolean | |
type BooleanOf Char # | |
Defined in Data.Boolean | |
type BooleanOf Double # | |
Defined in Data.Boolean | |
type BooleanOf Float # | |
Defined in Data.Boolean | |
type BooleanOf Int # | |
Defined in Data.Boolean | |
type BooleanOf Integer # | |
Defined in Data.Boolean | |
type BooleanOf [a] # | |
Defined in Data.Boolean | |
type BooleanOf (z -> a) # | |
Defined in Data.Boolean | |
type BooleanOf (a, b) # | |
Defined in Data.Boolean | |
type BooleanOf (a, b, c) # | |
Defined in Data.Boolean | |
type BooleanOf (a, b, c, d) # | |
Defined in Data.Boolean |
class Boolean (BooleanOf a) => IfB a where #
Types with conditionals
Instances
IfB Bool # | |
IfB Char # | |
IfB Double # | |
IfB Float # | |
IfB Int # | |
IfB Integer # | |
(Boolean (BooleanOf a), BooleanOf a ~ Bool) => IfB [a] # | |
Defined in Data.Boolean | |
IfB a => IfB (z -> a) # | |
Defined in Data.Boolean | |
(bool ~ BooleanOf p, bool ~ BooleanOf q, IfB p, IfB q) => IfB (p, q) # | |
Defined in Data.Boolean | |
(bool ~ BooleanOf p, bool ~ BooleanOf q, bool ~ BooleanOf r, IfB p, IfB q, IfB r) => IfB (p, q, r) # | |
Defined in Data.Boolean | |
(bool ~ BooleanOf p, bool ~ BooleanOf q, bool ~ BooleanOf r, bool ~ BooleanOf s, IfB p, IfB q, IfB r, IfB s) => IfB (p, q, r, s) # | |
Defined in Data.Boolean |
boolean :: (IfB a, bool ~ BooleanOf a) => a -> a -> bool -> a #
Expression-lifted conditional with condition last
cond :: (Applicative f, IfB a, bool ~ BooleanOf a) => f bool -> f a -> f a -> f a #
Point-wise conditional
crop :: (Applicative f, Monoid (f a), IfB a, bool ~ BooleanOf a) => f bool -> f a -> f a #
Generalized cropping, filling in mempty
where the test yields false.
class Boolean (BooleanOf a) => EqB a where #
Types with equality. Minimum definition: '(==*)'.
class Boolean (BooleanOf a) => OrdB a where #
Types with inequality. Minimum definition: '(<*)'.
(<*) :: bool ~ BooleanOf a => a -> a -> bool infix 4 #
(<=*) :: bool ~ BooleanOf a => a -> a -> bool infix 4 #