| Safe Haskell | Safe |
|---|---|
| Language | Haskell98 |
Data.Piso
Contents
Partial isomorphisms
Bidirectional isomorphism that is total when applied in the forward
direction (a -> b), but partial when applied in the backward direction
(b -> Maybe a).
This can be used to express constructor-deconstructor pairs. For example:
nil :: Piso t ([a] :- t)
nil = Piso f g
where
f t = [] :- t
g ([] :- t) = Just t
g _ = Nothing
cons :: Piso (a :- [a] :- t) ([a] :- t)
cons = Piso f g
where
f (x :- xs :- t) = (x : xs) :- t
g ((x : xs) :- t) = Just (x :- xs :- t)
g _ = NothingHere :- can be read as 'cons', forming a stack of values. For example,
nil pushes [] onto the stack; or, in the backward direction, tries to
remove [] from the stack. Representing constructor-destructor pairs as
stack manipulators allows them to be composed more easily.
Module Data.Piso.Common contains Pisos for some common datatypes.
Modules Data.Piso.Generic and Data.Piso.TH offer generic ways of
deriving Pisos for custom datatypes.