Imagine the following
data type:
data Person = Child { childAge :: Int, school :: School }
| Adult { adultAge :: Int, job :: Job }
Both the alternatives share an "age"
field, but in order to access it we are obliged to match all the
constructors:
personAge :: Person -> Int
personAge (Child {childAge = age}) = age
personAge (Adult {adultAge = age}) = age
Is there a way to define a common field in
a data type (somehow like inheritance in the OOP world)?
It would be practical if we could define "age :: Int" as a
common field and do something like:
personAge (_ {age = age}) = age
An alternative solution could be extracting the varying fields
in a different type:
data WorkingPerson = Child School | Adult Job
data Person = Person { age :: Int, workingPerson :: WorkingPerson
}
Or to make Person a type class (which
would probably require existential types in order to be useful).
But the first one looks simpler and more natural.
Does this feature exist (maybe in other forms) and, if not, is
there a reason?
Would it make sense to have a GHC extension (or even to make a
Template Haskell hack) for this feature?