優雅的鏡頭

除了用於生成 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