The fclabels package

[ Tags: benchmark, bsd3, data, lenses, library ] [ Propose Tags ]

This package provides first class labels that can act as bidirectional record fields. The labels can be derived automatically using Template Haskell which means you don't have to write any boilerplate yourself. The labels are implemented as lenses and are fully composable. Lenses can be used to get, set and modify parts of a data type in a consistent way.

See Data.Label for an introductory explanation or see the introductory blog post at

Internally lenses do not used Haskell functions directly, but are implemented as categories. Categories allow the lenses to be run in custom computational contexts. This approach allows us to make partial lenses that point to fields of multi-constructor datatypes in an elegant way.

See Data.Label.Partial for the use of partial labels.

We have both polymorphic and monomorphic lenses. Polymorphic lenses allow updates that change the type. The types of polymorphic lenses are slightly more verbose than their monomorphic counterparts, but their usage is similar. Because monomorphic lenses are built by restricting the types of polymorphic lenses they are essentially the same and can be freely composed with eachother.

See Data.Label.Mono and Data.Label.Poly for the difference between polymorphic and monomorphic lenses.

To simplify working with labels we supply both a set of labels for Haskell's base types, like lists, tuples, Maybe and Either, and we supply a set of combinators for working with labels for values in the Reader and State monad.

See Data.Label.Base and Data.Label.Monadic for more information.

  - Introduced polymorphic lenses.
  - Lenses are now based on getters and modifiers, not getters and setters.
  - Pure lenses are now named Total lenses.
  - Maybe lenses are now named Partial lenses.
  - Introduced Failing lenses that preserve errors.
  - Generalized Point data type.
  - Removed unused monadic functions for partial lenses.
  - Added ArrowFail type class.
  - Added lenses for base types. (tuples, lists, Maybe, Either)
  - Isomorphisms now uses regular function space for base morphism.
  - Swapped iso for more useful inv.
  - Introduced iso to more easily lift isomorphisms into lenses.
  - Removed mainly unused bimap.
  - Added derivation of lenses as expressions.
  - Convert record declarations directly into fclabels variants.
  - Allow deriving lenses for GADTs.
  - Added reasonably sophisticated totality checker for GADT labels.
  - Derived lenses can now fail in either ArrowZero or ArrowFail.
  - Alternative instance for Point.
  - Vertical composition for multi-constructor data types.
  - Extensive test suite.
  - Fully documented.


Versions 0.1, 0.1.2, 0.2.0, 0.3.0, 0.4.0, 0.4.1, 0.4.2,, 0.9.0, 0.9.1, 0.11.0, 0.11.1,, 0.11.2, 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.1.0,,,,, 1.1.2, 1.1.3, 1.1.4,,,, 1.1.5, 1.1.6, 1.1.7,, 2.0,,,,,, 2.0.1,, 2.0.2,,,,, 2.0.3,,
Dependencies base (>=4.4 && <5), mtl (>=1.0 && <2.2), template-haskell (>=2.2 && <2.9), transformers (>=0.2 && <0.4) [details]
License BSD3
Author Sebastiaan Visser, Erik Hesselink, Chris Eidhof, Sjoerd Visscher with lots of help and feedback from others.
Maintainer Sebastiaan Visser <>
Category Data, Lenses
Home page
Bug tracker
Source repository head: git clone git://
Uploaded Tue Oct 1 13:39:34 UTC 2013 by SebastiaanVisser
Updated Wed Jan 7 08:09:59 UTC 2015 by HerbertValerioRiedel to revision 1
Distributions Arch:, Debian:, LTSHaskell:, NixOS:, Stackage:, Tumbleweed:
Downloads 28611 total (386 in the last 30 days)
Rating 2.25 (2 ratings) [clear rating]
  • λ
  • λ
  • λ
Status Docs available [build log]
Successful builds reported [all 1 reports]
Hackage Matrix CI




Maintainer's Corner

For package maintainers and hackage trustees