.. _overloaded-record-dot:

Overloaded record dot
---------------------

.. extension:: OverloadedRecordDot
    :shortdesc: Record '.' syntax

    :since: 9.2.0

    Provides record '.' syntax e.g. ``x.foo``

When ``OverloadedRecordDot`` is enabled one can write ``a.b`` to mean the ``b`` field of the ``a`` record expression.

Example:

.. code-block:: haskell

  {-# LANGUAGE OverloadedRecordDot #-}
  {-# LANGUAGE DuplicateRecordFields #-}

  data Person = Person { name :: String }
  data Company = Company { name :: String, owner :: Person }

  main = do
    let c = Company { name = "Acme Corp."
                    , owner = Person { name = "Wile E. Coyote" } }
    print $ c.name ++ " is run by " ++ c.owner.name

You may also write ``(.b)`` to mean a function that "projects the ``b`` field from its argument". For example, ``(.b) a`` means the same thing as ``a.b``).

``OverloadedRecordDot`` is normally implemented by desugaring record ``.`` expressions to ``GHC.Records.getField`` expressions. By enabling ``OverloadedRecordDot`` and ``RebindableSyntax`` together it is possible to desugar ``.`` expressions into your own ``getField`` implementations.

When considering ``a.b``, the ``b`` field that is meant is determined by solving ``HasField`` constraints. See :ref:`solving-hasfield-constraints`.