Slide 1

Slide 1 text

5IF(SFBU1PXFSPG newtypeT !NS@LPOO IUUQTLPOOTBODPN 4MJEFTBSFBWBJMBCMFBUhttp://bit.ly/derivia
 &YBNQMFDPEFTBSFPO(JU)VCkonn/newtype-talk-five

Slide 2

Slide 2 text

4FMG*OUSPEVDUJPO w )JSPNJ*4)**ʢ!NS@LPOOʣ w %PDUPSBM$BOEJEBUFJO.BUIFNBUJDT w 3FTFBSDI"SFB.BUIFNBUJDBM-PHJD $PNQVUFS4DJFODF w 8SJUJOHBOEUFBDIJOH)BTLFMMGPSZFBST

Slide 3

Slide 3 text

5IF(SFBU1PXFSPGnewtypeT 3PMFT 4BGF[FSPDPTUDPFSDJPOT BOE%FSJWJOH7JB ʙ.POPJE&'PMEBCMFJODMVEFEʙ (SFBU

Slide 4

Slide 4 text

newtype

Slide 5

Slide 5 text

newtype newtype Foo α = Bar α newtype Id = MkId Word

Slide 6

Slide 6 text

newtype w "UZQFXJUIBTJOHMFDPOTUSVDUPSBOEpFME newtype Foo α = Bar α newtype Id = MkId Word

Slide 7

Slide 7 text

newtype w "UZQFXJUIBTJOHMFDPOTUSVDUPSBOEpFME w )BTUIF4BNFSFQSFTFOUBUJPOBTJUTPOMZpFME newtype Foo α = Bar α newtype Id = MkId Word

Slide 8

Slide 8 text

newtype w "UZQFXJUIBTJOHMFDPOTUSVDUPSBOEpFME w )BTUIF4BNFSFQSFTFOUBUJPOBTJUTPOMZpFME w %JTUJOHVJTIFEGSPNUIFPSJHJOBMUZQFBUUZQF MFWFM CVUIBTUIFTBNFNFNPSZSFQSFTFOUBUJPO BTUIFPSJHJOBM BOEFWBMVBUFETUSJDUMZ newtype Foo α = Bar α newtype Id = MkId Word

Slide 9

Slide 9 text

5ZQJDBM/FXCJF2VFTUJPO

Slide 10

Slide 10 text

5ZQJDBM/FXCJF2VFTUJPO 8IBUJTUIFEJ⒎FSFODFGSPNdata?"

Slide 11

Slide 11 text

5ZQJDBM/FXCJF2VFTUJPO 8IBUJTUIFEJ⒎FSFODFGSPNdata?" *UTF⒏DJFOUUIBOLTUPJUTSFQSFTFOUBUJPO

Slide 12

Slide 12 text

5ZQJDBM/FXCJF2VFTUJPO 8IBUJTUIFEJ⒎FSFODFGSPNdata?" *UTF⒏DJFOUUIBOLTUPJUTSFQSFTFOUBUJPO *UEPFTOUNBUUFSNVDIUPNF*ESBUIFS
 VTFdata

Slide 13

Slide 13 text

5ZQJDBM/FXCJF2VFTUJPO 8IBUJTUIFEJ⒎FSFODFGSPNdata?" *UTF⒏DJFOUUIBOLTUPJUTSFQSFTFOUBUJPO *UEPFTOUNBUUFSNVDIUPNF*ESBUIFS
 VTFdata 8FMM XFIBWFfunpack-strict-fieldsBOZIPX

Slide 14

Slide 14 text

3FBMMZ

Slide 15

Slide 15 text

3PMFTPGnewtypeT

Slide 16

Slide 16 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH module Data.Id (Id ()) where newtype Id = MkId Word

Slide 17

Slide 17 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally

Slide 18

Slide 18 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally )JEFEBUBDPOTMkId
 outside the module

Slide 19

Slide 19 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) )JEFEBUBDPOTMkId
 outside the module

Slide 20

Slide 20 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) 6OEFSJWBCMFJO)BTLFMM CVUXFDBOTIBSFWordTJNQM )JEFEBUBDPOTMkId
 outside the module

Slide 21

Slide 21 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) 6OEFSJWBCMFJO)BTLFMM CVUXFDBOTIBSFWordTJNQM &WPMWFT NPSFJO %FSJWJOH7JB )JEFEBUBDPOTMkId
 outside the module

Slide 22

Slide 22 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH *NQMFNFOUBUJPO4FMFDUJPO module Data.Id (Id ()) where newtype Id = MkId Word %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) 6OEFSJWBCMFJO)BTLFMM CVUXFDBOTIBSFWordTJNQM &WPMWFT NPSFJO %FSJWJOH7JB )JEFEBUBDPOTMkId
 outside the module

Slide 23

Slide 23 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH *NQMFNFOUBUJPO4FMFDUJPO {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) 6OEFSJWBCMFJO)BTLFMM CVUXFDBOTIBSFWordTJNQM &WPMWFT NPSFJO %FSJWJOH7JB module Data.Id (Id ()) where newtype Id = MkId Word )JEFEBUBDPOTMkId
 outside the module

Slide 24

Slide 24 text

3PMFTPGnewtypeT *NQMFNFOUBUJPO)JEJOH *NQMFNFOUBUJPO4IBSJOH *NQMFNFOUBUJPO4FMFDUJPO {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Id = MkId Word deriving (Num, Eq) 6OEFSJWBCMFJO)BTLFMM CVUXFDBOTIBSFWordTJNQM &WPMWFT NPSFJO %FSJWJOH7JB module Data.Id (Id ()) where newtype Id = MkId Word )JEFEBUBDPOTMkId
 outside the module %JTUJOHVJTIFEBUUZQFMFWFM CVUKVTUBWord internally

Slide 25

Slide 25 text

*NQMFNFOUBUJPO 4FMFDUJPO

Slide 26

Slide 26 text

*NQMFNFOUBUJPO 4FMFDUJPO .POPJE'PMEBCMFBT&YBNQMFT

Slide 27

Slide 27 text

&YFSDJTF-JTU4DBOOJOH 2 (JWFOBMJTUPGJOUFHFST DBMDVMBUFTJUTNBYJNVN BOEUPUBMTVNCZTDBOOJOHMJTUFYBDUMZPODF ˞%POPUVTFfoldlPSfoldsQBDLBHFT

Slide 28

Slide 28 text

5ZQJDBM"OTXFS

Slide 29

Slide 29 text

5ZQJDBM"OTXFS 'PMET

Slide 30

Slide 30 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) ˞ℕJTTIPSUGPS*OUFHFS

Slide 31

Slide 31 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT ˞ℕJTTIPSUGPS*OUFHFS

Slide 32

Slide 32 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT ˞ℕJTTIPSUGPS*OUFHFS

Slide 33

Slide 33 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT .BQ#JOBSZ 0QFSBUJPO ˞ℕJTTIPSUGPS*OUFHFS

Slide 34

Slide 34 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT .BQ#JOBSZ 0QFSBUJPO ˞ℕJTTIPSUGPS*OUFHFS

Slide 35

Slide 35 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT .BQ#JOBSZ 0QFSBUJPO 6OJUT ˞ℕJTTIPSUGPS*OUFHFS

Slide 36

Slide 36 text

5ZQJDBM"OTXFS 'PMET aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = foldr (λ a (m, s) " (Just a `max` m, a + s)) (Nothing, 0) 8FIBWFTJNJMBSPQFSBUJPOTPOCPUITJEFT .POPJET .BQ#JOBSZ 0QFSBUJPO 6OJUT ˞ℕJTTIPSUGPS*OUFHFS

Slide 37

Slide 37 text

.POPJET w "OPQFSBUJPOXIJDIDBOCFDPNQVUFECPUI GSPNMFGUBOESJHIU XJUIVOJUFMFNFOU • Both `max` and (+) • … can be computed from either left or right, • … has Nothing (no max) and 0 as units. • Mapping to monoid + folding ⤳ Foldable! x ∙ (y ∙ z) = (x ∙ y) ∙ z x ∙ ε = x = ε ∙ x

Slide 38

Slide 38 text

'PMEBCMFDMBTT class Foldable t where foldMap :: Monoid m 㱺 (a " m) " t a " m …

Slide 39

Slide 39 text

'PMEBCMFDMBTT class Foldable t where foldMap :: Monoid m 㱺 (a " m) " t a " m … .BQUP.POPJE
 'PMEMFGUUPSJHIU

Slide 40

Slide 40 text

'PMEBCMFDMBTT *UTV⒏DFTUPNBLFNBY pUJOUIJTGSBNFXPSL class Foldable t where foldMap :: Monoid m 㱺 (a " m) " t a " m … .BQUP.POPJE
 'PMEMFGUUPSJHIU

Slide 41

Slide 41 text

'PMEBCMFDMBTT *UTV⒏DFTUPNBLFNBY pUJOUIJTGSBNFXPSL 8FDBOIBWFBUNPTUPOFJOTUBODFGPSMonoid Word class Foldable t where foldMap :: Monoid m 㱺 (a " m) " t a " m … .BQUP.POPJE
 'PMEMFGUUPSJHIU

Slide 42

Slide 42 text

'PMEBCMFDMBTT *UTV⒏DFTUPNBLFNBY pUJOUIJTGSBNFXPSL 8FDBOIBWFBUNPTUPOFJOTUBODFGPSMonoid Word *NQMFNFOUBUJPO4FMFDUJPOVTJOHnewtypeT class Foldable t where foldMap :: Monoid m 㱺 (a " m) " t a " m … .BQUP.POPJE
 'PMEMFGUUPSJHIU

Slide 43

Slide 43 text

&YBNQMFJOTUBODFT newtype Sum a = Sum { getSum :: a} deriving (Num, Integral) instance Num a 㱺 Monoid (Sum a) where (<>) = (+); ε = 0 newtype Max a = Max { getMax :: a } deriving (Num, Integral, Ord) instance Ord a 㱺 Semigroup (Max a) where (<>) = max

Slide 44

Slide 44 text

&YBNQMFJOTUBODFT newtype Sum a = Sum { getSum :: a} deriving (Num, Integral) instance Num a 㱺 Monoid (Sum a) where (<>) = (+); ε = 0 newtype Max a = Max { getMax :: a } deriving (Num, Integral, Ord) instance Ord a 㱺 Semigroup (Max a) where (<>) = max .POPJEPG OVNFSJDBEEJUJPO

Slide 45

Slide 45 text

&YBNQMFJOTUBODFT newtype Sum a = Sum { getSum :: a} deriving (Num, Integral) instance Num a 㱺 Monoid (Sum a) where (<>) = (+); ε = 0 newtype Max a = Max { getMax :: a } deriving (Num, Integral, Ord) instance Ord a 㱺 Semigroup (Max a) where (<>) = max .POPJEPG OVNFSJDBEEJUJPO 4FNJHSPVQCZ UBLJOHNBY

Slide 46

Slide 46 text

&YBNQMFJOTUBODFT newtype Sum a = Sum { getSum :: a} deriving (Num, Integral) instance Num a 㱺 Monoid (Sum a) where (<>) = (+); ε = 0 newtype Max a = Max { getMax :: a } deriving (Num, Integral, Ord) instance Ord a 㱺 Semigroup (Max a) where (<>) = max .POPJEPG OVNFSJDBEEJUJPO 4FNJHSPVQCZ UBLJOHNBY *NQMTIBSJOHCZ (/%

Slide 47

Slide 47 text

1SBDUJDBM3FNBSL w 0OMZCPVOEFEUZQFTDBOCF\max min^NPOPJET 8F OFFENBYJNVNNJOJNVNFMFNFOUUPIBWFUIFVOJU w 8FTUJMMIBWFB4FNJSJOH XIJDIMBDLTVOJUT w 8FIBWFUPDPOWFSUJUUPNPOPJEUPVTFXJUI'PMEBCMF newtype Max a = Max a instance Ord a 㱺 Semigroup (Max a) instance Bounded a 㱺 Monoid (Max a)

Slide 48

Slide 48 text

1SBDUJDBM3FNBSL newtype Option a = Option (Maybe a) instance Semigroup a 㱺 Monoid (Option a)

Slide 49

Slide 49 text

1SBDUJDBM3FNBSL OptionBEKPJOTVOJU UVSOJOHTFNJHSPVQTJOUPNPOPJET newtype Option a = Option (Maybe a) instance Semigroup a 㱺 Monoid (Option a)

Slide 50

Slide 50 text

1SBDUJDBM3FNBSL OptionBEKPJOTVOJU UVSOJOHTFNJHSPVQTJOUPNPOPJET ʙ()$ɿ.BZCFSFRVJSFT.POPJEBBTBDPOTUSBJOU newtype Option a = Option (Maybe a) instance Semigroup a 㱺 Monoid (Option a) instance Monoid a 㱺 Monoid (Maybe a)

Slide 51

Slide 51 text

1SBDUJDBM3FNBSL OptionBEKPJOTVOJU UVSOJOHTFNJHSPVQTJOUPNPOPJET ʙ()$ɿ.BZCFSFRVJSFT.POPJEBBTBDPOTUSBJOU ()$ʙɿ3FRVJSFTPOMZSemigroup a, no need of 0QUJPO newtype Option a = Option (Maybe a) instance Semigroup a 㱺 Monoid (Option a) instance Monoid a 㱺 Monoid (Maybe a) instance Semigroup a 㱺 Monoid (Maybe a)

Slide 52

Slide 52 text

1SBDUJDBM3FNBSL OptionBEKPJOTVOJU UVSOJOHTFNJHSPVQTJOUPNPOPJET ʙ()$ɿ.BZCFSFRVJSFT.POPJEBBTBDPOTUSBJOU ()$ʙɿ3FRVJSFTPOMZSemigroup a, no need of 0QUJPO 8FTUJMMIBWFUPVTF0QUJPOUPXSJUFBQPSUBCMFDPEFTUIPVHI newtype Option a = Option (Maybe a) instance Semigroup a 㱺 Monoid (Option a) instance Monoid a 㱺 Monoid (Maybe a) instance Semigroup a 㱺 Monoid (Maybe a)

Slide 53

Slide 53 text

'PMEBCMFOFXUZQFWFSTJPO import Control.Arrow aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = fmap getMax *** getSum ○ foldMap (Just . Max &&& Sum)

Slide 54

Slide 54 text

'PMEBCMFOFXUZQFWFSTJPO 4PDPODJTF import Control.Arrow aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = fmap getMax *** getSum ○ foldMap (Just . Max &&& Sum)

Slide 55

Slide 55 text

'PMEBCMFOFXUZQFWFSTJPO 4PDPODJTF *UTTUJMMUFEJPVTUPVOXSBQ.BYBOE4VNUIFZ TJUTJOOFTUFEUZQFT import Control.Arrow aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = fmap getMax *** getSum ○ foldMap (Just . Max &&& Sum)

Slide 56

Slide 56 text

'PMEBCMFOFXUZQFWFSTJPO 4PDPODJTF *UTTUJMMUFEJPVTUPVOXSBQ.BYBOE4VNUIFZ TJUTJOOFTUFEUZQFT import Control.Arrow aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = fmap getMax *** getSum ○ foldMap (Just . Max &&& Sum) ‎;FSP$PTU$PFSDJPOT

Slide 57

Slide 57 text

4BGF;FSP$PTU $PFSDJPOTBOE3PMFT

Slide 58

Slide 58 text

4BGF;FSP$PTU $PFSDJPOTBOE3PMFT [1] Breitner, Eisenberg, Peyton Jones and Weirich, 2014 "HSFBUJOWFOUJPO
 PQFOJOHVQUIFOFXFSBPGOFXUZQFT

Slide 59

Slide 59 text

#FGPSF )BTLFMMFSTDPNQMBJOU

Slide 60

Slide 60 text

*OEFFE OFXUZQFTBSF DPOWJOFOUGPSJNQM TFMFDUJPO

Slide 61

Slide 61 text

#VUXFIBWFUPVOXSBQ UIFNPOFCZPOF

Slide 62

Slide 62 text

%PJOHTPJTOPUTP F⒏DJFOU

Slide 63

Slide 63 text

4JODFXFLOPXJUTTBGF XFDBOVTF VOTBGF$PFSDF

Slide 64

Slide 64 text

*UTOPURVJUFTNBSU

Slide 65

Slide 65 text

#VU

Slide 66

Slide 66 text

*O 
 5IF3FWPMVUJPOUPPLQMBDF UPOFXUZQFT

Slide 67

Slide 67 text

;FSP$PTU$PFSDJPO

Slide 68

Slide 68 text

;FSP$PTU$PFSDJPO import Data.Coerce (coerce) coerce :: Coercible a b 㱺 a " b

Slide 69

Slide 69 text

;FSP$PTU$PFSDJPO w $PFSDJCMFSFMBUFTUXPUZQFTXJUIUIFTBNFNFNPSZSFQS import Data.Coerce (coerce) coerce :: Coercible a b 㱺 a " b

Slide 70

Slide 70 text

;FSP$PTU$PFSDJPO w $PFSDJCMFSFMBUFTUXPUZQFTXJUIUIFTBNFNFNPSZSFQS w *UTFFNTMJLFBUZQFDMBTT CVU()$HFOFSBUFTBOJOGPSNBUJPO BUDPNQJMFUJNF BOEVTFSDBOOPUBEEDVTUPNJOTUBODF import Data.Coerce (coerce) coerce :: Coercible a b 㱺 a " b

Slide 71

Slide 71 text

;FSP$PTU$PFSDJPO w $PFSDJCMFSFMBUFTUXPUZQFTXJUIUIFTBNFNFNPSZSFQS w *UTFFNTMJLFBUZQFDMBTT CVU()$HFOFSBUFTBOJOGPSNBUJPO BUDPNQJMFUJNF BOEVTFSDBOOPUBEEDVTUPNJOTUBODF w 8JUIcoerceGSPNData.Coerce XFDBOEP[FSPDPTUDBTUT import Data.Coerce (coerce) coerce :: Coercible a b 㱺 a " b

Slide 72

Slide 72 text

;FSP$PTU$PFSDJPO w $PFSDJCMFSFMBUFTUXPUZQFTXJUIUIFTBNFNFNPSZSFQS w *UTFFNTMJLFBUZQFDMBTT CVU()$HFOFSBUFTBOJOGPSNBUJPO BUDPNQJMFUJNF BOEVTFSDBOOPUBEEDVTUPNJOTUBODF w 8JUIcoerceGSPNData.Coerce XFDBOEP[FSPDPTUDBTUT w *OGFSSFEQFSNPEVMF XFOFFEUIFJOGPPGEBUBDPOTUSVDUPS UPDBMMcoerce import Data.Coerce (coerce) coerce :: Coercible a b 㱺 a " b

Slide 73

Slide 73 text

8JUIDPFSDF import Control.Arrow aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = fmap getMax *** getSum ○ foldMap (Just . Max &&& Sum)

Slide 74

Slide 74 text

8FHFUJU import Control.Arrow import Data.Coerce aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = coerce ○ foldMap (Just . Max &&& Sum)

Slide 75

Slide 75 text

8FHFUJU import Control.Arrow import Data.Coerce aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = coerce ○ foldMap (Just . Max &&& Sum) $BTUJOH OFTUFE UZQFTXJUI[FSP DPTU

Slide 76

Slide 76 text

8FHFUJU import Control.Arrow import Data.Coerce aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = coerce ○ foldMap (Just . Max &&& Sum) coerce :: (Maybe (Max ), Sum ) → (Maybe , ) $BTUJOH OFTUFE UZQFTXJUI[FSP DPTU

Slide 77

Slide 77 text

8FHFUJU import Control.Arrow import Data.Coerce aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = coerce ○ foldMap (Just . Max &&& Sum) w /PF⒎FDUPOUIFPGTDBOOJOHTJODFJUT[FSPDPTU coerce :: (Maybe (Max ), Sum ) → (Maybe , ) $BTUJOH OFTUFE UZQFTXJUI[FSP DPTU

Slide 78

Slide 78 text

8FHFUJU import Control.Arrow import Data.Coerce aggregate :: [ℕ] " (Maybe ℕ, ℕ) aggregate = coerce ○ foldMap (Just . Max &&& Sum) w /PF⒎FDUPOUIFPGTDBOOJOHTJODFJUT[FSPDPTU w +VTUPOFDBMMGPSDPFSDFUPNBLFJUEPOF coerce :: (Maybe (Max ), Sum ) → (Maybe , ) $BTUJOH OFTUFE UZQFTXJUI[FSP DPTU

Slide 79

Slide 79 text

$BTUJOHCXOFTUFEUZQFT

Slide 80

Slide 80 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT

Slide 81

Slide 81 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ

Slide 82

Slide 82 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ newtype Down a = Down a instance Ord a 㱺 Ord (Down a) where a ≤ b = b ≤ a data Heap a minView :: Heap a " Maybe a

Slide 83

Slide 83 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ newtype Down a = Down a instance Ord a 㱺 Ord (Down a) where a ≤ b = b ≤ a data Heap a minView :: Heap a " Maybe a 3FWFSTFE0SEFS

Slide 84

Slide 84 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ newtype Down a = Down a instance Ord a 㱺 Ord (Down a) where a ≤ b = b ≤ a data Heap a minView :: Heap a " Maybe a 3FWFSTFE0SEFS )FBQ

Slide 85

Slide 85 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ newtype Down a = Down a instance Ord a 㱺 Ord (Down a) where a ≤ b = b ≤ a data Heap a minView :: Heap a " Maybe a 3FWFSTFE0SEFS )FBQ .JOJNVN 0

Slide 86

Slide 86 text

$BTUJOHCXOFTUFEUZQFT *UTDPOWFOJFOUUIBUXFDBODBTUBOZOFTUFEUZQFT 3FBMMZ newtype Down a = Down a instance Ord a 㱺 Ord (Down a) where a ≤ b = b ≤ a data Heap a minView :: Heap a " Maybe a 4FNBOUJDBMMZ Heap a.645/05CFDBTUFEUPHeap (Down a) 3FWFSTFE0SEFS )FBQ .JOJNVN 0

Slide 87

Slide 87 text

3PMFT

Slide 88

Slide 88 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF

Slide 89

Slide 89 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1

Slide 90

Slide 90 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1 .VTUCFJust 3!

Slide 91

Slide 91 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1 w 5IFOXFTQFDJGZUIF3PMF .VTUCFJust 3!

Slide 92

Slide 92 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF type role Heap nominal ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1 w 5IFOXFTQFDJGZUIF3PMF .VTUCFJust 3!

Slide 93

Slide 93 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF type role Heap nominal ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1 w 5IFOXFTQFDJGZUIF3PMF ghci> minView (coerce h :: Heap (Down Int)) error: Couldn't match type ‘Int’ with ‘Down Int’ .VTUCFJust 3!

Slide 94

Slide 94 text

3PMFT w 8FDBODBTUUIFNXJUIDPFSDF type role Heap nominal ghci> h = fromList [1,2,3] :: Heap Int ghci> minView (coerce h :: Heap (Down Int)) Just 1 w 5IFOXFTQFDJGZUIF3PMF ghci> minView (coerce h :: Heap (Down Int)) error: Couldn't match type ‘Int’ with ‘Down Int’ .VTUCFJust 3! w 8FDBOOPUDPFSDFXJUIPVUUIFJOGPPGOFXUZQFDPOTUSVDUPST

Slide 95

Slide 95 text

.PSFPO3PMFT

Slide 96

Slide 96 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT

Slide 97

Slide 97 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom

Slide 98

Slide 98 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO

Slide 99

Slide 99 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO w OPNJOBMNVTUIBWFFYBDUMZUIFTBNFUZQF

Slide 100

Slide 100 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO w OPNJOBMNVTUIBWFFYBDUMZUIFTBNFUZQF w QIBOUPNVOSFMBUFEUPJUTSFBMDPOUFOUBOZUIJOHHPFT

Slide 101

Slide 101 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO w OPNJOBMNVTUIBWFFYBDUMZUIFTBNFUZQF w QIBOUPNVOSFMBUFEUPJUTSFBMDPOUFOUBOZUIJOHHPFT w ()$JOGFSTNPTUHFOFSBMSPMFTBUFWFSZUJNF

Slide 102

Slide 102 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO w OPNJOBMNVTUIBWFFYBDUMZUIFTBNFUZQF w QIBOUPNVOSFMBUFEUPJUTSFBMDPOUFOUBOZUIJOHHPFT w ()$JOGFSTNPTUHFOFSBMSPMFTBUFWFSZUJNF w 4PNFUJNFTMJCSBSZJNQMFNFOUPSNVTUTQFDJGZSPMFT CFDBVTF ()$DBOUUFMMUIFTFNBOUJDTTQFDJpDUPUIFQBSUJDVMBSUZQF

Slide 103

Slide 103 text

.PSFPO3PMFT w 3PMF5IFUZQFWBSJBCMFIFSFCFIBWFTMJLFUIJT w 5ISFFLJOETrepresentational / nominal / phantom w SFQSFRVJWBMFOUJGUIFZIBWFUIFTBNFSFQSFTFOUBUJPO w OPNJOBMNVTUIBWFFYBDUMZUIFTBNFUZQF w QIBOUPNVOSFMBUFEUPJUTSFBMDPOUFOUBOZUIJOHHPFT w ()$JOGFSTNPTUHFOFSBMSPMFTBUFWFSZUJNF w 4PNFUJNFTMJCSBSZJNQMFNFOUPSNVTUTQFDJGZSPMFT CFDBVTF ()$DBOUUFMMUIFTFNBOUJDTTQFDJpDUPUIFQBSUJDVMBSUZQF w 8FDBOUDPFSDFUZQFTXJUIPVOFXUZQFDPOTUSVDUPSJOGP

Slide 104

Slide 104 text

$PFSDJPO3PMFT4VNNBSZ w 8JUIDPFSDFGVODUJPO XFDBODBTUOFTUUZQFT XJUIUIFTBNFSFQSFTFOUBUJPO XJUI[FSPDPTU w 8FDBOVTFOFXUZQFTNPSFTBGFMZBOE DPOWFOJFOUMZ w 8FDBODPOUSPMDBTUBCJMJUZCZTQFDJGZJOH3PMFT w 3PMFTBSFVTVBMMZJOGFSSFE w 8FIBWFUPTQFDJGZSPMFTXIFOXFXBOUUP EJTBMMPXDBTUTGPSUIFTFNBOUJDBMSFBTPOT

Slide 105

Slide 105 text

:FT 5IBUTXIBUXF XBOUFE

Slide 106

Slide 106 text

8IZXFEJEOUIBWF UIJT

Slide 107

Slide 107 text

1SFIJTUPSZPG;FSP$PTU $PFSDJPO(/%DSJTJT w 8FIBWF(FOFSBMJ[FE/FXUZQF%FSJWJOH (/% BULFBTUBMSFBEZJO()$ w "UUIBUUJNF ()$IBEPOMZBUBNFUZQF TZTUFN FWFSZUIJOHXBTpOF w -BUFS UZQFGBNJMJFT ("%5TBOETPPODBNF JOUPUIF()$TUZQFTZTUFNBOE w (/%CFDBNFVOPVOE

Slide 108

Slide 108 text

(/%XBTVOTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x))

Slide 109

Slide 109 text

(/%XBTVOTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x)) (/%

Slide 110

Slide 110 text

(/%XBTVOTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x)) (/% $BTUCXBOZUZQFT

Slide 111

Slide 111 text

5IBUTUFSSJCMF

Slide 112

Slide 112 text

8FIBWFUPTBWFUIF (/%

Slide 113

Slide 113 text

5IBUTXIZ3PMFT BSFFNFSHFE

Slide 114

Slide 114 text

(/%JT6OTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x))

Slide 115

Slide 115 text

(/%JT6OTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x)) (/%CFDBNFUP VTFDPFSDF

Slide 116

Slide 116 text

(/%JT6OTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x)) (/%CFDBNFUP VTFDPFSDF ()$JTDMFWFS FOPVHIUPJOGFSa BTOPNJOBM

Slide 117

Slide 117 text

(/%JT6OTPVOE newtype Id1 a = MkId1 a newtype Id2 a = MkId2 (Id1 a) deriving (UnsafeCast b) type family Discern a b type instance Discern (Id1 a) b = a type instance Discern (Id2 a) b = b class UnsafeCast to from where unsafe :: from " Discern from to instance UnsafeCast b (Id1 a) where unsafe (MkId1 x) = x unsafeCoerce :: a " b unsafeCoerce x = unsafe (MkId2 (MkId1 x)) (/%CFDBNFUP VTFDPFSDF ()$JTDMFWFS FOPVHIUPJOGFSa BTOPNJOBM 3FKFDU

Slide 118

Slide 118 text

Slide 119

Slide 119 text

/PX OFXUZQFTDBO QMBZUIFJSSPMFT
 UIBOLTUP3PMFT

Slide 120

Slide 120 text

3PMFTPGOFXUZQFT

Slide 121

Slide 121 text

*NQMFNFOUBUJPO
 )JEJOH

Slide 122

Slide 122 text

*NQMFNFOUBUJPO
 4IBSJOH

Slide 123

Slide 123 text

*NQMFNFOUBUJPO
 4FMFDUJPO

Slide 124

Slide 124 text

5IJTJTXIFSF
 OFXUZQFT TUBOETOPX

Slide 125

Slide 125 text

'SPNOPXPO 5IFGVUVSFPG OFXUZQF

Slide 126

Slide 126 text

5IFGVUVSFPGOFXUZQFT PS%FSJWJOH7JB

Slide 127

Slide 127 text

5IFGVUVSFPGOFXUZQFT PS%FSJWJOH7JB d8IFOUIFJNQMTIBSJOHBOETFMFDUJPONFFUd [2] Blöndal, Löh and Scott, 2018

Slide 128

Slide 128 text

%FSJWJOH7JB.PSF'MFYJCMF *NQMFNFOUBUJPO4IBSJOH

Slide 129

Slide 129 text

%FSJWJOH7JB.PSF'MFYJCMF *NQMFNFOUBUJPO4IBSJOH w "OFXGFBUVSFPG()$

Slide 130

Slide 130 text

%FSJWJOH7JB.PSF'MFYJCMF *NQMFNFOUBUJPO4IBSJOH w "OFXGFBUVSFPG()$ w ()$BMQIBJTSFMFBTFEBUUIFUJNF PGUIJTUBML

Slide 131

Slide 131 text

%FSJWJOH7JB.PSF'MFYJCMF *NQMFNFOUBUJPO4IBSJOH w "OFXGFBUVSFPG()$ w ()$BMQIBJTSFMFBTFEBUUIFUJNF PGUIJTUBML w 8FDBOVTFOFXUZQFTBTBIJOUGPSEFSJWJOH DMBVTFT

Slide 132

Slide 132 text

&H.POPJETUSVDUVSFPG*E {-# LANGUAGE DerivingVia #-} newtype Id = MkId Word deriving (Semigroup, Monoid) via Max Word

Slide 133

Slide 133 text

&H.POPJETUSVDUVSFPG*E w "TXFIBWFTFFO 8PSEIBWFNVMUJQMFNPOPJEJNQMT {-# LANGUAGE DerivingVia #-} newtype Id = MkId Word deriving (Semigroup, Monoid) via Max Word

Slide 134

Slide 134 text

&H.POPJETUSVDUVSFPG*E w "TXFIBWFTFFO 8PSEIBWFNVMUJQMFNPOPJEJNQMT w 4VQQPTFXFXBOUUPVTFDIPPTJOHUIFOFXFTU*E .BYJNVN *E BTNPOPJEPQFSBUJPOPO*ET {-# LANGUAGE DerivingVia #-} newtype Id = MkId Word deriving (Semigroup, Monoid) via Max Word

Slide 135

Slide 135 text

&H.POPJETUSVDUVSFPG*E w "TXFIBWFTFFO 8PSEIBWFNVMUJQMFNPOPJEJNQMT w 4VQQPTFXFXBOUUPVTFDIPPTJOHUIFOFXFTU*E .BYJNVN *E BTNPOPJEPQFSBUJPOPO*ET w Max WordIBTUIFTBNFSFQSBTId GPSNTBNPOPJEXJUI SFTQFDUUP NBY {-# LANGUAGE DerivingVia #-} newtype Id = MkId Word deriving (Semigroup, Monoid) via Max Word

Slide 136

Slide 136 text

&H.POPJETUSVDUVSFPG*E w "TXFIBWFTFFO 8PSEIBWFNVMUJQMFNPOPJEJNQMT w 4VQQPTFXFXBOUUPVTFDIPPTJOHUIFOFXFTU*E .BYJNVN *E BTNPOPJEPQFSBUJPOPO*ET w Max WordIBTUIFTBNFSFQSBTId GPSNTBNPOPJEXJUI SFTQFDUUP NBY w %FSJWJOH7JBDBOMJGUUIJTJNQMBVUPNBUJDBMMZUP*E {-# LANGUAGE DerivingVia #-} newtype Id = MkId Word deriving (Semigroup, Monoid) via Max Word

Slide 137

Slide 137 text

%FSJWJOH7JBWT(/%

Slide 138

Slide 138 text

%FSJWJOH7JBWT(/% w %FSJWJOH7JBJTBTVQFSTFUPG(/%

Slide 139

Slide 139 text

%FSJWJOH7JBWT(/% w %FSJWJOH7JBJTBTVQFSTFUPG(/% w (/%KVTUMPPLTBUUIFJOOFSNPTUUZQF

Slide 140

Slide 140 text

%FSJWJOH7JBWT(/% w %FSJWJOH7JBJTBTVQFSTFUPG(/% w (/%KVTUMPPLTBUUIFJOOFSNPTUUZQF w %FSJWJOH7JBMFUVTSFVTFUIFJNQMPGBOZ $PFSDJCMFUZQFT XJUIPVUBOZDPTU

Slide 141

Slide 141 text

%FSJWJOH7JBJTOPUMJNJUFEUP OFXUZQFT

Slide 142

Slide 142 text

%FSJWJOH7JBJTOPUMJNJUFEUP OFXUZQFT w *OUIFPSJHJOBMQBQFS JUJTQSPQPTFEUPVTF %FSJWJOH7JBUPTIBSFJNQMFNFOUBUJPOT CFUXFFOBOZJTPNPQIJDUZQFT ˞5IJTJTPNPSQIJDNFBOTTMJHIUMZTUSPOHFSDPOEJUJPO
 ɹJUNFBOTUIFJSHFOFSJDSFQSFTFOUBUJPOJTUIFTBNF

Slide 143

Slide 143 text

%FSJWJOH7JBJTOPUMJNJUFEUP OFXUZQFT w *OUIFPSJHJOBMQBQFS JUJTQSPQPTFEUPVTF %FSJWJOH7JBUPTIBSFJNQMFNFOUBUJPOT CFUXFFOBOZJTPNPQIJDUZQFT $PNCJOBUJPOPG(FOFSJDTBOE$PFSDJPO ˞5IJTJTPNPSQIJDNFBOTTMJHIUMZTUSPOHFSDPOEJUJPO
 ɹJUNFBOTUIFJSHFOFSJDSFQSFTFOUBUJPOJTUIFTBNF

Slide 144

Slide 144 text

%FNP 4UBUJDEFpOJUJPOPG+40/EFTFSJBMJ[BUJPOJOTUBODF *NQMTIBSJOHCXJTPNPSQIJDUZQFT ˞$PNQMFUFDPEFJTBWBJMBCMFBUhttp://bit.ly/derivia

Slide 145

Slide 145 text

$PNQMJDBUFE&YBNQMF w 4QFDJpFTUIFFODPEJOHNFUIPEBUUZQFMFWFM w 4UBUJDBMMZBTTVSFTUIBUTBNFFODPEJOHJTVTFEJO'SPN+40/5P+40/ data OtherConfig = OtherConfig { otrNameOfProcess :: Maybe String , otrArgsToProcess :: [String] } deriving (Read, Show, Eq, Ord, Generic) deriving (ToJSON, FromJSON) via WithOptions '[ FieldLabelModifier '[CamelTo2 "-"] , ConstructorTagModifier '[CamelTo2 "-"] , OmitNothingFields 'True ] OtherConfig

Slide 146

Slide 146 text

&YBNQMFPG*TP data Blog = Blog { authors :: [Author] , articles :: [Article] } deriving (Generic) deriving (Semigroup, Monoid) via Blog `SameRepAs` ([Author], Dual [Article]) {- ghci> mconcat [Blog ["1"] ["1"], Blog ["2"] ["3","4"]] Blog {authors = ["1","2"], articles = ["3","4","1"]} -}

Slide 147

Slide 147 text

&YBNQMFPG*TP DPOU newtype SameRepAs a b = SameRepAs { runSameRepAs :: a } type Iso a b = (Generic a, Generic b, Coercible (Rep a ()) (Rep b ())) instance (Semigroup b, Iso a b) 㱺 Semigroup (SameRepAs a b) where SameRepAs a <> SameRepAs b = ... instance (Monoid b, Iso a b) 㱺 Monoid (SameRepAs a b) where mempty = SameRepAs $ toA mempty where toA :: b -> a toA = to . (coerce :: Rep b () -> Rep a ()) . from

Slide 148

Slide 148 text

%FSJWJOH7JB4VNNBSZ

Slide 149

Slide 149 text

%FSJWJOH7JB4VNNBSZ w "WBJMBCMFTJODF()$

Slide 150

Slide 150 text

%FSJWJOH7JB4VNNBSZ w "WBJMBCMFTJODF()$ w 8FDBOVTFOFXUZQFTUPTQFDJGZUIFJNQMGPS EFSJWJOHDMBVTFT

Slide 151

Slide 151 text

%FSJWJOH7JB4VNNBSZ w "WBJMBCMFTJODF()$ w 8FDBOVTFOFXUZQFTUPTQFDJGZUIFJNQMGPS EFSJWJOHDMBVTFT w $PNCJOFEXJUI(FOFSJDT XFDBOFWFOEFSJWFUIF JOTUBODFGSPNJTPNPSQIJDUZQF CVUOPU OFDFTTBSJMZSFQSFTFOUBUJPOBMMZFRVBM

Slide 152

Slide 152 text

%FSJWJOH7JB4VNNBSZ w "WBJMBCMFTJODF()$ w 8FDBOVTFOFXUZQFTUPTQFDJGZUIFJNQMGPS EFSJWJOHDMBVTFT w $PNCJOFEXJUI(FOFSJDT XFDBOFWFOEFSJWFUIF JOTUBODFGSPNJTPNPSQIJDUZQF CVUOPU OFDFTTBSJMZSFQSFTFOUBUJPOBMMZFRVBM w "OZPUIFSJTPNPSQIJTNFYQSFTTJCMFBTBUZQF DPOTUSBJOUJTBMTPBQQMJDBCMFUPUIJTUFDIOJRVF

Slide 153

Slide 153 text

4VNNBSZ

Slide 154

Slide 154 text

4VNNBSZ

Slide 155

Slide 155 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT

Slide 156

Slide 156 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT w *NQMFNFOUBUJPO)JEJOH4IBSJOH4FMFDUJPO

Slide 157

Slide 157 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT w *NQMFNFOUBUJPO)JEJOH4IBSJOH4FMFDUJPO w 8JUI%BUB$PFSDF XFDBODBTUSFQSFTFOUBUJPOBMMZ FRVBMMUZQFTXJUI[FSPDPTU

Slide 158

Slide 158 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT w *NQMFNFOUBUJPO)JEJOH4IBSJOH4FMFDUJPO w 8JUI%BUB$PFSDF XFDBODBTUSFQSFTFOUBUJPOBMMZ FRVBMMUZQFTXJUI[FSPDPTU w 5IFOFXUZQF3FWPMVUJPOTUBSUFEIFSF

Slide 159

Slide 159 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT w *NQMFNFOUBUJPO)JEJOH4IBSJOH4FMFDUJPO w 8JUI%BUB$PFSDF XFDBODBTUSFQSFTFOUBUJPOBMMZ FRVBMMUZQFTXJUI[FSPDPTU w 5IFOFXUZQF3FWPMVUJPOTUBSUFEIFSF w 8FDBOUSFBUDPNQPVOEUZQFTQSPQFSMZXJUISPMF JOGFSFODFBOEBOOPUBUJPOT

Slide 160

Slide 160 text

4VNNBSZ w 5ISFFSPMFTPGOFXUZQFT w *NQMFNFOUBUJPO)JEJOH4IBSJOH4FMFDUJPO w 8JUI%BUB$PFSDF XFDBODBTUSFQSFTFOUBUJPOBMMZ FRVBMMUZQFTXJUI[FSPDPTU w 5IFOFXUZQF3FWPMVUJPOTUBSUFEIFSF w 8FDBOUSFBUDPNQPVOEUZQFTQSPQFSMZXJUISPMF JOGFSFODFBOEBOOPUBUJPOT w 4JODF()$ %FSJWJOH7JBFOBCMFTVTUPVTF OFXUZQFUPDVTUPNJTFUIFEFSJWJOHDMBVTFT

Slide 161

Slide 161 text

3FGFSFODFT 1. J. Breitner, R. A. Eisenberg, S. P. Jones and S. Weirich, Safe Zero-cost Coercions for Haskell, ICFP 2014. 2. Baldur Blöndal, Andres Löh and Ryan Scott, Deriving Via: How to Turn Hand-Written Instances into an Anti-Pattern, ICFP18.