smash: Combinators for Maybe types
You can imagine these three types as
Maybe (Either a b),
Maybe (Either a (Either b (a,b)), and
Maybe (These a b) respectively. It turns out that that each of these datatypes has spcial properties:
Wedgedatatype represents the coproduct (like,
Either) in the category Hask* of pointed Hask types, called a wedge sum. One can derive this by noting that units are the same in Haskell, and the sum of two pointed types is
(1 + a) + (1 + b) ~ 1 + a + b ~ Wedge a b.
Candatatype represents the product (like,
(,)) in Hask*. You can derive this by considering the product of two pointed types
(1 + a) * (1 + b) ~ 1 + a + b + a*b ~ Can a b.
Smashdatatype represents a special type of product, a smash product, in the category Hask*. The smash product is a symmetric, monoidal tensor in Hask* that plays nicely with the product, ‘Can’, and coproduct, ‘Wedge’.
Pictorially, these datatypes look like this:
'Can': a | Non +---+---+ (a,b) | b 'Wedge': a | Nowhere +-------+ | b 'Smash': Nada +--------+ (a,b)
Revision history for possibly-can
- CPP to extend to 8.2.2 without warnings
- First version. Released on an unsuspecting world.