MergeableRecord is intended to be a super class for classes providing
update operations on records. The ADT induced by such a set of operations
can be considered a mergeable record, which can be merged into larger
mergeable records essentially by function composition. Finalization turns
a mergeable record into a record.

Typical use:

Given

data Foo = Foo {l1 :: T1, l2 :: T2}

one define a mergeable record type (MR Foo) by the following instance: