Types that are parametric on unary type-constructors that control their shapes are like Barbies that can wear different clothes to become a different doll. This is a common Haskell-idiom. E.g.,
data Person f
= Person
{ name :: f String
, age :: f Int
}
b1 :: Person Last -- Barbie with a monoid structure
b2 :: Person (Const a) -- container Barbie
b3 :: Person Identity -- Barbie's new clothes
This package provides basic classes and abstractions to work with these types and easily transform them. See the docs to learn more.