优雅的镜头

除了用于生成 Lenses 的标准 makeLenses 功能外,Control.Lens.TH 还提供了 makeClassy 功能。makeClassy 具有相同的类型,其工作方式与 makeLenses 基本相同,只有一个关键区别。除了生成标准镜头和遍历之外,如果类型没有参数,它还将创建一个类,描述所有具有该类型字段的数据类型。例如

data Foo = Foo { _fooX, _fooY::Int }
  makeClassy ''Foo

将创造

class HasFoo t where
   foo::Simple Lens t Foo

instance HasFoo Foo where foo = id

fooX, fooY::HasFoo t => Simple Lens t Int