Copyright | (C) 2017 Csongor Kiss |
---|---|
License | BSD3 |
Maintainer | Csongor Kiss <kiss.csongor.kiss@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Structural subtype relationships between sum types.
- class AsSubtype sub sup where
Prisms
class AsSubtype sub sup where Source #
Structural subtyping between sums. A sum Sub
is a subtype of another sum
Sup
if a value of Sub
can be given (modulo naming of constructors)
whenever a value of Sup
is expected. In the running example for instance,
FourLeggedAnimal
is a subtype of Animal
since a value of the former can
be given as a value of the latter (renaming Dog4
to Dog
and Cat4
to
Cat
).
_Sub :: Prism' sup sub Source #
A prism that captures structural subtyping. Allows a substructure to be injected (upcast) into a superstructure or a superstructure to be downcast into a substructure (which may fail).
>>>
_Sub # dog4 :: Animal
Dog (MkDog {name = "Snowy", age = 4})>>>
cat ^? _Sub :: Maybe FourLeggedAnimal
Just (Cat4 "Mog" 5)>>>
duck ^? _Sub :: Maybe FourLeggedAnimal
Nothing
injectSub :: sub -> sup Source #
Injects a subtype into a supertype (upcast).
projectSub :: sup -> Either sup sub Source #
Projects a subtype from a supertype (downcast).