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 _ = Nothing
Here :-
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 Piso
s for some common datatypes.
Modules Data.Piso.Generic
and Data.Piso.TH
offer generic ways of
deriving Piso
s for custom datatypes.