This package consists of 3 interesting datatypes and their respective monad transformers:
Wedge: Isomorphic to Maybe (Either a b). The Wedge datatype represents the coproduct in the category Hask* of pointed Hask types, called a wedge sum. One can derive this type as follows:
Either (Maybe a) (Maybe b)
~ (1 + a) + (1 + b)
-- units are the same via pushout
~ 1 + a + b
~ Maybe (Either a b)
~ Wedge a b
Can: Isomorphic to Maybe (These a b). The Can datatype represents the product in Hask*. One can derive this as follows:
(Maybe a, Maybe a)
~ (1 + a) * (1 + b)
-- products distribute over coproducts
~ 1 + b + a + a*b
-- coproducts are associative
~ 1 + (b + a + a*b)
~ 1 + These a b
~ Maybe (These a b)
~ Can a b
Smash: Isomorphic to Maybe (a,b). The Smash datatype represents a special type of product, a
smash product, in the category Hask*. The smash product is a symmetric, monoidal tensor in Hask* that is the quotient of Can over Wedge. It can be derived as follows:
Can a b / Wedge a b
~ 1 + a + b + a*b / 1 + a + b
-- reassoc coproduct
~ (1 + a + b) + a*b / 1 + a + b
-- def. of quotient: (1 + a + b) ~ 1
~ 1 + a * b
~ Maybe (a,b)
~ Smash a b
Changes
Revision history for possibly-can
0.1.2
Add Monad Transformers for Can, Wedge, and Smash (#25)
Add Safe haskell pragmas
Add instances for all functor classes.
Add instances for MonadZip
Add nice pointfree definitions for some functions (#24, thanks @subttle!)