generic-lens- Generic data-structure operations exposed as lenses.

Copyright(C) 2017 Csongor Kiss
MaintainerCsongor Kiss <>
Safe HaskellSafe




Structural subtype relationships between sum types.



Running example:

>>> :set -XTypeApplications
>>> :set -XDataKinds
>>> :set -XDeriveGeneric
>>> import GHC.Generics
>>> :m +Data.Generics.Internal.Lens
>>> :{
data Animal
  = Dog Dog
  | Cat Name Age
  | Duck Age
  deriving (Generic, Show)
data FourLeggedAnimal
  = Dog4 Dog
  | Cat4 Name Age
  deriving (Generic, Show)
data Dog = MkDog
  { name :: Name
  , age  :: Age
  deriving (Generic, Show)
type Name = String
type Age  = Int
dog, cat, duck :: Animal
dog = Dog (MkDog "Shep" 3)
cat = Cat "Mog" 5
duck = Duck 2
dog4, cat4 :: FourLeggedAnimal
dog4 = Dog4 (MkDog "Snowy" 4)
cat4 = Cat4 "Garfield" 6

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).

Minimal complete definition

injectSub, projectSub


_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

injectSub :: sub -> sup Source #

Injects a subtype into a supertype (upcast).

projectSub :: sup -> Either sup sub Source #

Projects a subtype from a supertype (downcast).


(Generic sub, Generic sup, GAsSubtype (Rep sub) (Rep sup)) => AsSubtype sub sup Source # 


_Sub :: Prism' sup sub Source #

injectSub :: sub -> sup Source #

projectSub :: sup -> Either sup sub Source #