Created
February 25, 2022 07:06
-
-
Save steshaw/f65af0efc906e7381e287200f128a29e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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