Using records, especially nested records, in Haskell can sometimes be a bit of a chore. Fortunately, there are several libraries in hackage that make working with records easier. This library is my attempt to build on top of these libraries to make working with records even more pleasant!

In most imperative languages, records are accessed using the infix dot operator. Record fields can be read simply by suffixing a record value with .field and they can be modified by simply assigning to that location. Although this is not the only way to access records (indeed, Haskell does not use it), many people (including myself) like it. This library attempts to support this style for Haskell records in the following manner:

record.field.subfield becomes record .# field # subfield record.field = value becomes record .# field =: value

Of course, the infix assignment in Haskell is pure and doesn't actually mutate anything. Rather, a modified version of the record is returned.

In addition, the following features are supported:

Accessing several fields simultaneously using tuples. Example: record .# (field1, field2, field3)

Accessing records inside a Functor . Example: recordInFunctor <.#> field

Composing fields with Applicative functors and Monad s. Example: record .# applicativeField <#> subfield

Pattern matching using ViewPatterns . Example: case record of (match field -> 1) -> ...

Easy comparisons etc. using onField . Example: sortBy (compare `onField` field#subfield) records

For a detailed description of usage, see Data.Record.Field.

This library is a work-in-progress. Some limitations, deficiencies, points of interest and possible future improvements include: