{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE PolyKinds #-} ----------------------------------------------------------------------------- -- | -- Module : GHC.Records -- Copyright : (c) Adam Gundry 2015-2016 -- License : see libraries/base/LICENSE -- -- Maintainer : cvs-ghc@haskell.org -- Stability : internal -- Portability : non-portable (GHC extensions) -- -- This module defines the 'HasField' class used by the -- @OverloadedRecordFields@ extension. See the -- <https://gitlab.haskell.org/ghc/ghc/wikis/records/overloaded-record-fields -- wiki page> for more details. -- ----------------------------------------------------------------------------- module GHC.Records ( HasField(..) ) where -- | Constraint representing the fact that the field @x@ belongs to -- the record type @r@ and has field type @a@. This will be solved -- automatically, but manual instances may be provided as well. -- HasField :: forall {k}. k -> * -> * -> Constraint -- getField :: forall {k} (x::k) r a. HasField x r a => r -> a -- NB: The {k} means that k is an 'inferred' type variable, and -- hence not provided in visible type applications. Thus you -- say getField @"foo" -- not getField @Symbol @"foo" class HasField x r a | x r -> a where -- | Selector function to extract the field from the record. getField :: r -> a