{-# OPTIONS_GHC -fplugin=Overloaded -fplugin-opt=Overloaded:RecordFields #-} {-# OPTIONS_GHC -dcore-lint #-} -- {-# OPTIONS_GHC -ddump-simpl #-} {-# OPTIONS_GHC -O0 #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeApplications #-} module Main (main) where import Test.HUnit ((@?=)) import GHC.Records.Compat import GHC.Records.Extra main :: IO () main = do -- Overloaded:RecordFields let bob = MkCat "Bob" (3 :: Int) "" getField @"petName" bob @?= "Bob" setField @"petExtra" bob "foo" @?= bob { petExtra = "foo" } modifyField @"petAge" bob succ @?= bob { petAge = 4 } print $ getField @"petName" bob data Pet u = MkCat { petName :: String , petAge :: Int , petExtra :: u } deriving (Eq, Show)