Safe Haskell | None |
---|---|
Language | Haskell2010 |
Sometimes one needs a type like
Barbie
and it may feel like
a second-class record type, where one needs to
unpack values in each field. For those cases, we can leverage on
closed type-families:Identity
dataBare
dataCovered
type familyWear
t f a whereWear
Bare
f a = aWear
Covered
f a = f a data SignUpForm t f = SignUpForm' { username ::Wear
t fString
, , password ::Wear
t fString
, mailingOk ::Wear
t fBool
} instanceFunctorB
(SignUpFormCovered
) instanceTraversableB
(SignUpFormCovered
) ..., instanceBareB
SignUpForm type SignUpRaw = SignUpFormMaybe
type SignUpData = SignUpFormBare
formData = SignUpForm "jbond" "shaken007" False :: SignUpData
Bare values
type family Wear t f a where ... Source #
The Wear
type-function allows one to define a Barbie-type as
data B t f = B { f1 ::Wear
t fInt
, f2 ::Wear
t fBool
}
This gives rise to two rather different types:
B
is a normal Barbie-type, in the sense thatCovered
ff1 :: B
, etc.Covered
f -> fInt
B
, on the other hand, is a normal record with no functor around the type:Bare
f
B { f1 :: 5, f2 =True
} :: BBare
f
Covering and stripping
class FunctorB (b Covered) => BareB b where Source #
Class of Barbie-types defined using Wear
and can therefore
have Bare
versions. Must satisfy:
bcover
.bstrip
=id
bstrip
.bcover
=id
Nothing