Skip to content

Instantly share code, notes, and snippets.

@tfausak
Created August 4, 2016 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tfausak/0d70d1c74d0a04a49a4d80366771481c to your computer and use it in GitHub Desktop.
Save tfausak/0d70d1c74d0a04a49a4d80366771481c to your computer and use it in GitHub Desktop.
Overloaded records in Haskell.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import qualified Control.Lens as Lens
import qualified Data.Default.Class as Default
import qualified Data.OverloadedRecords as OverloadedRecords
import qualified Data.OverloadedRecords.TH as OverloadedRecords
data A = A { aX :: Bool, aY :: Bool } deriving (Show)
$(OverloadedRecords.overloadedRecord Default.def ''A)
data B = B { bX :: Char, bZ :: Char } deriving (Show)
$(OverloadedRecords.overloadedRecord Default.def ''B)
main :: IO ()
main = do
let a = A False True
print (OverloadedRecords.get #x a) -- False
print (a Lens.^. #y) -- True
print (OverloadedRecords.set' #x True a) -- A {aX = True, aY = True}
print (a Lens.& #y Lens..~ False) -- A {aX = False, aY = False}
let b = B '@' '#'
print (OverloadedRecords.get #x b) -- '@'
print (b Lens.^. #z) -- '#'
print (OverloadedRecords.set' #x '$' b) -- B {bX = '$', bZ = '#'}
print (b Lens.& #z Lens..~ '!') -- B {bX = '@', bZ = '!'}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment