HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulegeneric-optics-lite-0.1Haskell2010

Data.Generics.Optics.Lite

Derive record field lenses generically.

Usage with labels in Optics.Label

Optics.Label provides LabelOptic class which powers the OverloadedLabels instance for optics type.

It's possible to use HasField and field to derive instances generically. If we have a simple record type which has Generic instance:

data Ex = Ex { exA :: Int, exB :: Char } deriving (Generic)

We can derive LabelOptic instances for all its fields at once:

instance (HasField name Ex a, a ~ b) => LabelOptic name A_Lens Ex Ex a b where
    labelOptic = field @name

Note: GHC will ask you to enable a lot of extensions, do it. Youn need to enable UndecidableInstances in particular to make FunctionalDependencies check pass.

  • 1 class
  • 1 value
valuefield :: HasField name r a => Lens' r a
#

A lens that focuses on a field with a given name. Compatible with the optics package's Lens type.

Note: the lens is simple, i.e. doesn't allow type-changing updates. This keeps the implementation small and quick.

You also may want to specify {-# OPTIONS_GHC -funfolding-keeness-factor=100 #-} (or some other arbitrarily large number) for GHC to inline more aggressively.

classclass HasField (name :: Symbol) r a | name r -> a where
#

Type-class restricting field usage.

Instances2HasField
  • HasFieldInternal name r a => HasField name r aDefined in generic-lens-lite-0.1 · Data.Generics.Lens.Lite
  • HasField name (Void1 a) aDefined in generic-lens-lite-0.1 · Data.Generics.Lens.Lite