In addition to the standard makeLenses
function for generating Lens
es, Control.Lens.TH
also offers the makeClassy
function. makeClassy
has the same type and works in essentially the same way as makeLenses
, with one key difference. In addition to generating the standard lenses and traversals, if the type has no arguments, it will also create a class describing all the datatypes which possess the type as a field. For example
data Foo = Foo { _fooX, _fooY :: Int }
makeClassy ''Foo
will create
class HasFoo t where
foo :: Simple Lens t Foo
instance HasFoo Foo where foo = id
fooX, fooY :: HasFoo t => Simple Lens t Int