Skip to content

Instantly share code, notes, and snippets.

@steshaw
Created February 25, 2022 07:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steshaw/f65af0efc906e7381e287200f128a29e to your computer and use it in GitHub Desktop.
Save steshaw/f65af0efc906e7381e287200f128a29e to your computer and use it in GitHub Desktop.
{-# language DataKinds #-}
{-# language DuplicateRecordFields #-}
{-# language OverloadedRecordDot #-}
import GHC.Records
data Person = Person
{ name :: String
, pet :: Pet
, partner :: Maybe Person
}
class Display a where
display :: a -> String
instance Display Person
where display p = "Person { name = \"" <> p.name <> "\"}"
data Pet = Pet
{ name :: String
}
deriving Show
instance Display Pet where
display = show
dino = Pet {name = "Dino"}
wilma = Person {name = "Wilma", pet = dino, partner = Just fred}
fred = Person {name = "Fred Flintstone", pet = dino, partner = Just wilma}
data T where
A :: Display a => a -> T
s :: T -> String
s (A a) = display a
main = do
print $ map (s . snd) [("dino", A dino), ("wilma", A wilma), ("fred", A fred)]
print dino
print $ display wilma
print $ display fred
putStrLn fred.name
putStrLn $ (.name) fred
putStrLn $ fred.pet.name
putStrLn $ (.name) $ (.pet) fred
putStrLn $ getField @"name" $ getField @"pet" $ fred
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment