Copyright | (C) 2020 Csongor Kiss |
---|---|
License | BSD3 |
Maintainer | Csongor Kiss <kiss.csongor.kiss@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Structural subtype relationships between product types.
Lenses
Running example:
>>>
:set -XTypeApplications
>>>
:set -XDataKinds
>>>
:set -XDeriveGeneric
>>>
:set -XDuplicateRecordFields
>>>
import GHC.Generics
>>>
:m +Data.Generics.Internal.VL.Lens
>>>
:{
data Human = Human { name :: String , age :: Int , address :: String } deriving (Generic, Show) data Animal = Animal { name :: String , age :: Int } deriving (Generic, Show) human :: Human human = Human "Tunyasz" 50 "London" :}
class Subtype sup sub where Source #
Structural subtype relationship
sub
is a (structural) subtype
of sup
, if its fields are a subset of
those of sup
.
super :: Lens sub sub sup sup Source #
Structural subtype lens. Given a subtype relationship sub :< sup
,
we can focus on the sub
structure of sup
.
>>>
human ^. super @Animal
Animal {name = "Tunyasz", age = 50}
>>>
set (super @Animal) (Animal "dog" 10) human
Human {name = "dog", age = 10, address = "London"}
Cast the more specific subtype to the more general supertype
>>>
upcast human :: Animal
Animal {name = "Tunyasz", age = 50}
>>>
upcast (upcast human :: Animal) :: Human
... ... The type 'Animal' is not a subtype of 'Human'. ... The following fields are missing from 'Animal': ... address ...
smash :: sup -> sub -> sub Source #
Plug a smaller structure into a larger one
>>>
smash (Animal "dog" 10) human
Human {name = "dog", age = 10, address = "London"}
Instances
Subtype a Void Source # | See Note [Uncluttering type signatures] >>> :t +d super super :: (Subtype sup sub, Functor f) => (sup -> f sup) -> sub -> f sub |
Subtype a a Source # | |
Context a b => Subtype b a Source # | |
Subtype Void a Source # | See Note [Uncluttering type signatures]
>>> :t +d super |