Upgrade to Pro — share decks privately, control downloads, hide ads and more …

本当はすごい newtype

本当はすごい newtype

FIVE社ピザ会で 2018/08/07 に発表した、Haskell の newtype に関する講演です。
GHC 8.6.1 で導入される DerivingVia 言語拡張の説明もあります。

ソースコード:http://github.com/konn/newtype-talk-five

Hiromi Ishii

August 07, 2018
Tweet

More Decks by Hiromi Ishii

Other Decks in Programming

Transcript

  1. ຊ౰͸͍͢͝
    newtype
    !NS@LPOO
    IUUQTLPOOTBODPN
    4MJEFTBSFBWBJMBCMFBUhttp://bit.ly/derivia

    &YBNQMFDPEFTBSFPO(JU)VCkonn/newtype-talk-five

    View Slide

  2. ࣗݾ঺հ
    w ੴҪେւʢ!NS@LPOOʣ
    ͍ ͠ ͍ ͻ Ζ Έ
    w ਺ֶઐ߈ത࢜՝ఔ೥
    w ਺ཧ࿦ཧֶͱܭࢉػՊֶͱ͔
    w ؾ͚ͮ͹)BTLFMMྺ೥

    View Slide

  3. ຊ౰͸͍͢͝newtype
    3PMFT 4BGF[FSPDPTUDPFSDJPOT BOE%FSJWJOH7JB
    ʙ.POPJE&'PMEBCMF΋͋ΔΑʙ
    ͍͢͝ʂ

    View Slide

  4. newtype

    View Slide

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

    View Slide

  6. newtype
    w ͨͩҰͭͷߏஙࢠͱϑΟʔϧυΛ࣋ͭσʔλܕ
    newtype Foo α = Bar α
    newtype Id = MkId Word

    View Slide

  7. newtype
    w ͨͩҰͭͷߏஙࢠͱϑΟʔϧυΛ࣋ͭσʔλܕ
    w ಺෦දݱ͕།ҰͷϑΟʔϧυͷܕͱಉҰ
    newtype Foo α = Bar α
    newtype Id = MkId Word

    View Slide

  8. newtype
    w ͨͩҰͭͷߏஙࢠͱϑΟʔϧυΛ࣋ͭσʔλܕ
    w ಺෦දݱ͕།ҰͷϑΟʔϧυͷܕͱಉҰ
    w ܕͷ্Ͱ͸۠ผ͞ΕΔ͕ɺϝϞϦ্Ͱͷදݱ
    ͸ಉҰͰɺϑΟʔϧυ΋ʮਖ਼֨ʯʹධՁ͞ΕΔ
    newtype Foo α = Bar α
    newtype Id = MkId Word

    View Slide

  9. ॳ৺ऀ͋Δ͋Δ

    View Slide

  10. ॳ৺ऀ͋Δ͋Δ
    ʮ;ͭ͏ͷdataએݴͱԿ͕ҧ͏ͷʁʯ

    View Slide

  11. ॳ৺ऀ͋Δ͋Δ
    ʮ;ͭ͏ͷdataએݴͱԿ͕ҧ͏ͷʁʯ
    ʮ಺෦දݱ͕ಉ͔ͩ͡Βޮ཰తͩΑʯ

    View Slide

  12. ॳ৺ऀ͋Δ͋Δ
    ʮ;ͭ͏ͷdataએݴͱԿ͕ҧ͏ͷʁʯ
    ʮ಺෦දݱ͕ಉ͔ͩ͡Βޮ཰తͩΑʯ
    ʮޮ཰·ͩͲ͏Ͱ΋͍͍͠dataͰ͍͍΍ʯ

    View Slide

  13. ॳ৺ऀ͋Δ͋Δ
    ʮ;ͭ͏ͷdataએݴͱԿ͕ҧ͏ͷʁʯ
    ʮ಺෦දݱ͕ಉ͔ͩ͡Βޮ཰తͩΑʯ
    ʮޮ཰·ͩͲ͏Ͱ΋͍͍͠dataͰ͍͍΍ʯ
    ʮࠓ͸VOQBDLTUSJDUpFME΋͋Δ͠ʜʜʯ

    View Slide

  14. ͦΜͳ͜ͱ͸ͳ͍

    View Slide

  15. newtypeͷͭͷ༻్

    View Slide

  16. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    module Data.Id (Id ()) where
    newtype Id = MkId Word

    View Slide

  17. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word

    View Slide

  18. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  19. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    ࣮૷ͷڞ༗
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    newtype Id = MkId Word deriving (Num, Eq)
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  20. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    ࣮૷ͷڞ༗
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    newtype Id = MkId Word deriving (Num, Eq)
    ຊདྷ͸ಋग़ෆՄͰ΋
    Wordͷ࣮૷͕ڞ༗Ͱ͖Δ
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  21. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    ࣮૷ͷڞ༗
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    newtype Id = MkId Word deriving (Num, Eq)
    ຊདྷ͸ಋग़ෆՄͰ΋
    Wordͷ࣮૷͕ڞ༗Ͱ͖Δ
    %FSJWJOH7JB
    ͰߋʹਐԽ
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  22. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    ࣮૷ͷڞ༗
    ࣮૷ͷબ୒
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    newtype Id = MkId Word deriving (Num, Eq)
    ຊདྷ͸ಋग़ෆՄͰ΋
    Wordͷ࣮૷͕ڞ༗Ͱ͖Δ
    %FSJWJOH7JB
    ͰߋʹਐԽ
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  23. newtypeͷͭͷ༻్
    ࣮૷ͷӅṭ
    ࣮૷ͷڞ༗
    ࣮૷ͷબ୒
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    newtype Id = MkId Word deriving (Num, Eq)
    ຊདྷ͸ಋग़ෆՄͰ΋
    Wordͷ࣮૷͕ڞ༗Ͱ͖Δ
    %FSJWJOH7JB
    ͰߋʹਐԽ
    module Data.Id (Id ()) where
    newtype Id = MkId Word ܕͷ্Ͱ͸۠ผ
    Ͱ΋಺෦తʹ͸Word
    ֎෦ʹ͸σʔλߏஙࢠ
    MkId͸Ӆṭ

    View Slide

  24. ࣮૷ͷબ୒

    View Slide

  25. ࣮૷ͷબ୒
    .POPJEͱ'PMEBCMFΛྫʹ

    View Slide

  26. ྫ୊ɿϦετͷ૸ࠪ
    ໰ ੔਺ͷϦετ͕༩͑ΒΕͨ࣌ɺͦͷ࠷େ஋ͱ
    ૯࿨ΛҰճͷ૸ࠪͰٻΊΑɻ
    ˞foldl͓Αͼfoldsύοέʔδ͸Έͳ͔ͬͨࣄʹ͍ͯͩ͘͠͞

    View Slide

  27. ղ౴ྫ

    View Slide

  28. ղ౴ྫ
    ৞ΈࠐΈͩʂ

    View Slide

  29. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  30. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  31. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  32. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    ม׵ʴೋ߲ԋࢉ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  33. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    ม׵ʴೋ߲ԋࢉ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  34. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    ม׵ʴೋ߲ԋࢉ
    ୯Ґݩ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  35. ղ౴ྫ
    ৞ΈࠐΈͩʂ
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate = foldr
    (λ a (m, s) ! (Just a `max` m, a + s))
    (Nothing, 0)
    Կ͔ࣅͨΑ͏ͳ͜ͱ΍ͬͯΜͳʜʜ
    .POPJEͩʂ
    ม׵ʴೋ߲ԋࢉ
    ୯Ґݩ
    ˞ℕ͸*OUFHFSͷུͩͱࢥ͍ͬͯͩ͘͞

    View Slide

  36. .POPJE
    w ࠨӈͷผͳ͘ܭࢉͰ͖ͯɺ୯Ґݩ͕͋Δ΍ͭ
    • max ΋ + ΋……
    • ࠨ͔Β΍ͬͯ΋ӈ͔Β΍ͬͯ΋ಉ͡
    • Nothing (࠷େ஋ແ͠) ͱ 0 ͕୯Ґݩ (ɛ)
    • ϞϊΠυม׵ʴ৞ΈࠐΈ ⤳ Foldable!
    x ∙ (y ∙ z) = (x ∙ y) ∙ z
    x ∙ ε = x = ε ∙ x

    View Slide

  37. 'PMEBCMFܕΫϥε
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    View Slide

  38. 'PMEBCMFܕΫϥε
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    ϞϊΠυʹม׵


    ࠨ͔Β৞ΈࠐΈ

    View Slide

  39. 'PMEBCMFܕΫϥε
    ͜ͷ࿮૊ΈʹNBY
    ΛམͱͤΕ͹Αͦ͞͏
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    ϞϊΠυʹม׵


    ࠨ͔Β৞ΈࠐΈ

    View Slide

  40. 'PMEBCMFܕΫϥε
    ͜ͷ࿮૊ΈʹNBY
    ΛམͱͤΕ͹Αͦ͞͏
    Monoid WordΠϯελϯε͸ߴʑҰ͔ͭ͠ॻ͚ͳ͍ʜʜ
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    ϞϊΠυʹม׵


    ࠨ͔Β৞ΈࠐΈ

    View Slide

  41. 'PMEBCMFܕΫϥε
    ͜ͷ࿮૊ΈʹNBY
    ΛམͱͤΕ͹Αͦ͞͏
    Monoid WordΠϯελϯε͸ߴʑҰ͔ͭ͠ॻ͚ͳ͍ʜʜ
    ͦ͜ͰnewtypeʹΑΔ࣮૷ͷબ୒ʂ
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    ϞϊΠυʹม׵


    ࠨ͔Β৞ΈࠐΈ

    View Slide

  42. Πϯελϯεྫ
    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

    View Slide

  43. Πϯελϯεྫ
    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
    ਺ͷՃ๏ʹؔ͢Δ

    ϞϊΠυ

    View Slide

  44. Πϯελϯεྫ
    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
    ਺ͷՃ๏ʹؔ͢Δ

    ϞϊΠυ
    ࠷େݶʹؔ͢Δ

    ൒܈

    View Slide

  45. Πϯελϯεྫ
    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
    ਺ͷՃ๏ʹؔ͢Δ

    ϞϊΠυ
    ࠷େݶʹؔ͢Δ

    ൒܈
    (/%ʹΑΔ

    ࣮૷ͷڞ༗

    View Slide

  46. ࣮ࡍ্ͷ஫ҙ
    w ༗քͳܕ͔͠ϞϊΠυʹͳΒͳ͍ʂʢ࠷େখݩ͕ͳ͍ͱ୯
    ҐݩʹͳΒͳ͍ͷͰʣ
    w ୯Ґݩͷͳ͍൒܈ʹ͸ͳΔ
    w ൒܈͔ΒϞϊΠυʹม׵͠ͳ͍ͱ'PMEBCMF͸࢖͑ͳ͍ʂ
    newtype Max a = Max a
    instance Ord a 㱺 Semigroup (Max a)
    instance Bounded a 㱺 Monoid (Max a)

    View Slide

  47. ࣮ࡍ্ͷ஫ҙ
    newtype Option a = Option (Maybe a)
    instance Semigroup a 㱺 Monoid (Option a)

    View Slide

  48. ࣮ࡍ্ͷ஫ҙ
    0QUJPO͸൒܈ʹ୯ҐݩΛ෇͚଍ͯ͠ϞϊΠυʹ͢Δ
    newtype Option a = Option (Maybe a)
    instance Semigroup a 㱺 Monoid (Option a)

    View Slide

  49. ࣮ࡍ্ͷ஫ҙ
    0QUJPO͸൒܈ʹ୯ҐݩΛ෇͚଍ͯ͠ϞϊΠυʹ͢Δ
    ʙ()$ɿ.BZCF͸੍໿ͱͯ͠.POPJEBΛཁٻʂ
    newtype Option a = Option (Maybe a)
    instance Semigroup a 㱺 Monoid (Option a)
    instance Monoid a 㱺 Monoid (Maybe a)

    View Slide

  50. ࣮ࡍ্ͷ஫ҙ
    0QUJPO͸൒܈ʹ୯ҐݩΛ෇͚଍ͯ͠ϞϊΠυʹ͢Δ
    ʙ()$ɿ.BZCF͸੍໿ͱͯ͠.POPJEBΛཁٻʂ
    ()$ʙɿ4FNJHSPVQBʹͳΓɺ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)

    View Slide

  51. ࣮ࡍ্ͷ஫ҙ
    0QUJPO͸൒܈ʹ୯ҐݩΛ෇͚଍ͯ͠ϞϊΠυʹ͢Δ
    ʙ()$ɿ.BZCF͸੍໿ͱͯ͠.POPJEBΛཁٻʂ
    ()$ʙɿ4FNJHSPVQBʹͳΓɺ0QUJPO͸ෆཁʹʂ
    ͱ͸͍͑ɺϙʔλϒϧͳίʔυΛॻ͜͏ͱࢥͬͨΒ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)

    View Slide

  52. 'PMEBCMF/FXUZQF൛
    import Control.Arrow
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    fmap getMax *** getSum
    ○ foldMap (Just . Max &&& Sum)

    View Slide

  53. 'PMEBCMF/FXUZQF൛
    ਵ෼͖ͬ͢Γʂ
    import Control.Arrow
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    fmap getMax *** getSum
    ○ foldMap (Just . Max &&& Sum)

    View Slide

  54. 'PMEBCMF/FXUZQF൛
    ਵ෼͖ͬ͢Γʂ
    Ͱ΋Ұʑ.BY 4VNΛണ͢ͷ͸μϧ͍ͳ͋ʜʜωε
    τͯ͠Δ͠ʜʜ
    import Control.Arrow
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    fmap getMax *** getSum
    ○ foldMap (Just . Max &&& Sum)

    View Slide

  55. 'PMEBCMF/FXUZQF൛
    ਵ෼͖ͬ͢Γʂ
    Ͱ΋Ұʑ.BY 4VNΛണ͢ͷ͸μϧ͍ͳ͋ʜʜωε
    τͯ͠Δ͠ʜʜ
    import Control.Arrow
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    fmap getMax *** getSum
    ○ foldMap (Just . Max &&& Sum)
    ‎;FSP$PTU$PFSDJPOT

    View Slide

  56. 4BGF;FSP$PTU
    $PFSDJPOTBOE3PMFT

    View Slide

  57. 4BGF;FSP$PTU
    $PFSDJPOTBOE3PMFT
    [1] Breitner, Eisenberg, Peyton Jones and Weirich, 2014
    ʙOFXUZQFͷະདྷΛ੾Γ୓͍ͨେൃ໌ʙ

    View Slide

  58. ೥Ҏલͷ
    )BTLFMMFSͷ΅΍͖ɿ

    View Slide

  59. ͔ͨ͠ʹ࣮૷ͷબ୒ʹ
    OFXUZQF͸ศར͚ͩͲ͞ʜʜ

    View Slide

  60. ݁ہҰຕҰຕണͯ͠

    ͍͔ͳ͍ͱ͍͚ͳ͍͠

    View Slide

  61. ͦ͏͢Δͱޮ཰͸

    ѱ͍͡ΌΜ

    View Slide

  62. ҆શ͔ͩΒVOTBGF$PFSDF
    ࢖͏ख΋͋Δ͚Ͳ

    View Slide

  63. ͋Μ·៉ྷ͡Όͳ͍ʜʜ

    View Slide

  64. ͔͠͠

    View Slide

  65. ɹ೥ɺ
    OFXUZQFʹ
    ֵ໋͕ى͖ͨ

    View Slide

  66. ;FSP$PTU$PFSDJPO

    View Slide

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

    View Slide

  68. ;FSP$PTU$PFSDJPO
    w $PFSDJCMF͸಺෦දݱ͕ಉ͡ܕಉ࢜Λؔ࿈͚ͮΔܕ੍໿
    import Data.Coerce (coerce)
    coerce :: Coercible a b 㱺 a ! b

    View Slide

  69. ;FSP$PTU$PFSDJPO
    w $PFSDJCMF͸಺෦දݱ͕ಉ͡ܕಉ࢜Λؔ࿈͚ͮΔܕ੍໿
    w ҰݟܕΫϥε͕ͩɺ࣮ࡍʹ͸()$͕ίϯύΠϧ࣌ʹ৘ใΛੜ੒
    ͠ɺউखʹΠϯελϯεΛ௥ՃͰ͖ͳ͍
    import Data.Coerce (coerce)
    coerce :: Coercible a b 㱺 a ! b

    View Slide

  70. ;FSP$PTU$PFSDJPO
    w $PFSDJCMF͸಺෦දݱ͕ಉ͡ܕಉ࢜Λؔ࿈͚ͮΔܕ੍໿
    w ҰݟܕΫϥε͕ͩɺ࣮ࡍʹ͸()$͕ίϯύΠϧ࣌ʹ৘ใΛੜ੒
    ͠ɺউखʹΠϯελϯεΛ௥ՃͰ͖ͳ͍
    w Data.Coerceͷcoerceؔ਺ͰθϩίετͷΩϟετ͕Ͱ͖Δʂ
    import Data.Coerce (coerce)
    coerce :: Coercible a b 㱺 a ! b

    View Slide

  71. ;FSP$PTU$PFSDJPO
    w $PFSDJCMF͸಺෦දݱ͕ಉ͡ܕಉ࢜Λؔ࿈͚ͮΔܕ੍໿
    w ҰݟܕΫϥε͕ͩɺ࣮ࡍʹ͸()$͕ίϯύΠϧ࣌ʹ৘ใΛੜ੒
    ͠ɺউखʹΠϯελϯεΛ௥ՃͰ͖ͳ͍
    w Data.Coerceͷcoerceؔ਺ͰθϩίετͷΩϟετ͕Ͱ͖Δʂ
    w Ϟδϡʔϧຖʹਪ࿦ɺcoerceʹ͸σʔλߏஙࢠͷ৘ใ͕ඞཁ
    import Data.Coerce (coerce)
    coerce :: Coercible a b 㱺 a ! b

    View Slide

  72. ͜ΕΛ࢖͑͹ʜʜ
    import Control.Arrow
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    fmap getMax *** getSum
    ○ foldMap (Just . Max &&& Sum)

    View Slide

  73. ͜͏ͳΓ·͢
    import Control.Arrow
    import Data.Coerce
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    coerce ○ foldMap (Just . Max &&& Sum)

    View Slide

  74. ͜͏ͳΓ·͢
    import Control.Arrow
    import Data.Coerce
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    coerce ○ foldMap (Just . Max &&& Sum)
    ω
    ε
    τ
    ܕ
    ΋

    θ
    ϩ
    ί
    ε
    τ
    Ͱ

    ׵
    ʂ

    View Slide

  75. ͜͏ͳΓ·͢
    import Control.Arrow
    import Data.Coerce
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    coerce ○ foldMap (Just . Max &&& Sum)
    coerce :: (Maybe (Max ), Sum ) → (Maybe , )
    ω
    ε
    τ
    ܕ
    ΋

    θ
    ϩ
    ί
    ε
    τ
    Ͱ

    ׵
    ʂ

    View Slide

  76. ͜͏ͳΓ·͢
    import Control.Arrow
    import Data.Coerce
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    coerce ○ foldMap (Just . Max &&& Sum)
    w θϩίετͳͷͰɺ૸ࠪ͸Ұճ͚ͩ
    coerce :: (Maybe (Max ), Sum ) → (Maybe , )
    ω
    ε
    τ
    ܕ
    ΋

    θ
    ϩ
    ί
    ε
    τ
    Ͱ

    ׵
    ʂ

    View Slide

  77. ͜͏ͳΓ·͢
    import Control.Arrow
    import Data.Coerce
    aggregate :: [ℕ] ! (Maybe ℕ, ℕ)
    aggregate =
    coerce ○ foldMap (Just . Max &&& Sum)
    w θϩίετͳͷͰɺ૸ࠪ͸Ұճ͚ͩ
    w લޙͷܕ͕͔ͬ͠Γܾ·͍ͬͯΔͷͰDPFSDFҰൃͰऴྃ
    coerce :: (Maybe (Max ), Sum ) → (Maybe , )
    ω
    ε
    τ
    ܕ
    ΋

    θ
    ϩ
    ί
    ε
    τ
    Ͱ

    ׵
    ʂ

    View Slide

  78. ωετܕͷม׵

    View Slide

  79. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ

    View Slide

  80. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ

    View Slide

  81. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ
    newtype Down a = Down a
    instance Ord a 㱺 Ord (Down a) where
    a ≤ b = b ≤ a
    data Heap a
    minView :: Heap a ! Maybe a

    View Slide

  82. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ
    newtype Down a = Down a
    instance Ord a 㱺 Ord (Down a) where
    a ≤ b = b ≤ a
    data Heap a
    minView :: Heap a ! Maybe a
    ٯॱΛೖΕΔ

    View Slide

  83. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ
    newtype Down a = Down a
    instance Ord a 㱺 Ord (Down a) where
    a ≤ b = b ≤ a
    data Heap a
    minView :: Heap a ! Maybe a
    ٯॱΛೖΕΔ
    ώʔϓ

    View Slide

  84. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ
    newtype Down a = Down a
    instance Ord a 㱺 Ord (Down a) where
    a ≤ b = b ≤ a
    data Heap a
    minView :: Heap a ! Maybe a
    ٯॱΛೖΕΔ
    ώʔϓ
    ࠷খݩ0

    View Slide

  85. ωετܕͷม׵
    ͲΜͳίϯςφதͷܕ΋ม׵Ͱ͖ͯศརʂ
    ຊ౰ʹʁ
    newtype Down a = Down a
    instance Ord a 㱺 Ord (Down a) where
    a ≤ b = b ≤ a
    data Heap a
    minView :: Heap a ! Maybe a
    ҙຯ࿦తʹ Heap aͱHeap (Down a)͸Ωϟετग़དྷͳ͍΂͖
    ٯॱΛೖΕΔ
    ώʔϓ
    ࠷খݩ0

    View Slide

  86. ͦ͜Ͱ3PMFT

    View Slide

  87. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ

    View Slide

  88. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1

    View Slide

  89. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1 Just 3Ͱ͋Δ΂͖ʂ

    View Slide

  90. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1
    w ͦ͜Ͱ3PMFΛࢦఆɿ
    Just 3Ͱ͋Δ΂͖ʂ

    View Slide

  91. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    type role Heap nominal
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1
    w ͦ͜Ͱ3PMFΛࢦఆɿ
    Just 3Ͱ͋Δ΂͖ʂ

    View Slide

  92. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    type role Heap nominal
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1
    w ͦ͜Ͱ3PMFΛࢦఆɿ
    ghci> minView (coerce h :: Heap (Down Int))
    error: Couldn't match type ‘Int’ with ‘Down Int’
    Just 3Ͱ͋Δ΂͖ʂ

    View Slide

  93. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    type role Heap nominal
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1
    w ͦ͜Ͱ3PMFΛࢦఆɿ
    ghci> minView (coerce h :: Heap (Down Int))
    error: Couldn't match type ‘Int’ with ‘Down Int’
    Just 3Ͱ͋Δ΂͖ʂ
    w σʔλߏஙࢠΛ࿐ग़͠ͳ͚Ε͹ɺଞͷϞδϡʔϧͰ͸OPNJOBMʹਪ࿦͞ΕΔഺ

    View Slide

  94. ͦ͜Ͱ3PMFT
    w ͜ͷ··Ͱ͸DPFSDFͰม׵ग़དྷͯ͠·͏ʂ
    type role Heap nominal
    ghci> h = fromList [1,2,3] :: Heap Int
    ghci> minView (coerce h :: Heap (Down Int))
    Just 1
    w ͦ͜Ͱ3PMFΛࢦఆɿ
    ghci> minView (coerce h :: Heap (Down Int))
    error: Couldn't match type ‘Int’ with ‘Down Int’
    Just 3Ͱ͋Δ΂͖ʂ
    w σʔλߏஙࢠΛ࿐ग़͠ͳ͚Ε͹ɺଞͷϞδϡʔϧͰ͸OPNJOBMʹਪ࿦͞ΕΔഺ
    w OFXUZQFߏஙࢠͷ৘ใΛJNQPSU͠ͳ͍ͱDPFSDFͰ͖ͳ͍

    View Slide

  95. 3PMFTৄࡉ

    View Slide

  96. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ

    View Slide

  97. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom

    View Slide

  98. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ

    View Slide

  99. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ
    w OPNJOBMʮ׬શʹಉ͡ܕ͡Όͳ͍ͱͩΊʯ

    View Slide

  100. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ
    w OPNJOBMʮ׬શʹಉ͡ܕ͡Όͳ͍ͱͩΊʯ
    w QIBOUPNʮλμͷ০Γʂத਎ʹؔ܎ͳ͠ʯ

    View Slide

  101. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ
    w OPNJOBMʮ׬શʹಉ͡ܕ͡Όͳ͍ͱͩΊʯ
    w QIBOUPNʮλμͷ০Γʂத਎ʹؔ܎ͳ͠ʯ
    w ()$͸దٓ࠷΋ҰൠతͳSPMFΛਪ࿦ͯ͘͠ΕΔ

    View Slide

  102. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ
    w OPNJOBMʮ׬શʹಉ͡ܕ͡Όͳ͍ͱͩΊʯ
    w QIBOUPNʮλμͷ০Γʂத਎ʹؔ܎ͳ͠ʯ
    w ()$͸దٓ࠷΋ҰൠతͳSPMFΛਪ࿦ͯ͘͠ΕΔ
    w σʔλܕݻ༗ͷҙຯ࿦͸Ϣʔβ͔͠஌Βͳ͍ͷͰɺࠓճͷΑ
    ͏ͳέʔεͰ͸ϥΠϒϥϦ࣮૷ऀ͕ࢦఆ

    View Slide

  103. 3PMFTৄࡉ
    w 3PMFʮ͜ͷܕม਺͸͜͏͍͏ౕͰ͢ʯ
    w ࡾछɿrepresentational / nominal / phantom
    w SFQSʮ͜͜͸಺෦දݱ͕ಉ͡ͳΒಉ஋ʯ
    w OPNJOBMʮ׬શʹಉ͡ܕ͡Όͳ͍ͱͩΊʯ
    w QIBOUPNʮλμͷ০Γʂத਎ʹؔ܎ͳ͠ʯ
    w ()$͸దٓ࠷΋ҰൠతͳSPMFΛਪ࿦ͯ͘͠ΕΔ
    w σʔλܕݻ༗ͷҙຯ࿦͸Ϣʔβ͔͠஌Βͳ͍ͷͰɺࠓճͷΑ
    ͏ͳέʔεͰ͸ϥΠϒϥϦ࣮૷ऀ͕ࢦఆ
    w OFXUZQFߏஙࢠͷ৘ใ͕ͳ͍ͱcoerce͸ෆՄೳ

    View Slide

  104. $PFSDJPO3PMFT·ͱΊ
    w DPFSDFؔ਺Λ࢖͏ͱ಺෦දݱͷಉ͡ܕ͸ωε
    τ͍ͯͯ͠΋θϩίετͰม׵Մೳ
    w OFXUZQFͷར༻͕ΑΓ҆શɾ؆୯ʹʂ
    w ࡉ͔ͳม׵Մೳੑ͸3PMFΛࢦఆ੍ͯ͠ޚ
    w ීஈ͸3PMF͸ਪ࿦͞ΕΔͷͰ໰୊ͳ͠
    w ҙຯ࿦্ม׵͞ΕΔͱࠔΔʗม׵ग़དྷͯ΄͠
    ͍΋ͷ͸ࣗ෼Ͱࢦఆ

    View Slide

  105. ͜Ε͜Εɺ

    ͜͏͍͏ͷཉ͔ͬͨ͠

    View Slide

  106. ͔ͯͳΜͰͳ͔ͬͨͷʁ

    View Slide

  107. ;FSP$PTU$PFSDJPOલ࢙ɿ
    (/%ͷड೉
    w (FOFSBMJ[FE/FXUZQF%FSJWJOH (/%
    ͸()$
    ͷࠒʹ͸طʹ͋ͬͨ
    w ͜ͷࠒ͸()$͸ܕγεςϜ͕߇͑໨Ͱɺશͯ
    ͸্ख͘ճ͍ͬͯͨ
    w ͦͷޙɺܕ଒΍("%5TͳͲ͕ೖΓʜʜ
    w ؾ෇͘ͱ(/%͸ෆ݈શʹͳ͍ͬͯͨʂ

    View Slide

  108. (/%͸ෆ݈શ
    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))

    View Slide

  109. (/%͸ෆ݈શ
    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))
    (/%

    View Slide

  110. (/%͸ෆ݈શ
    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))
    (/%
    ೚ҙͷܕؒͷΩϟετʂ

    View Slide

  111. ͜Ε͸·͍ͣʜʜ

    View Slide

  112. (/%Λٹ͍͍ͨʜʜ

    View Slide

  113. ʜʜͱ͍͏ܦҢͰ
    3PMF͕ݱΕͨ

    View Slide

  114. (/%͸ෆ݈શ
    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))

    View Slide

  115. (/%͸ෆ݈શ
    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))
    (/%͸DPFSDF
    Λܦ༝͢ΔΑ͏ʹ

    View Slide

  116. (/%͸ෆ݈શ
    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))
    (/%͸DPFSDF
    Λܦ༝͢ΔΑ͏ʹ
    ()$͸ݡ͍ͷͰ
    BΛOPNJOBMʹਪ࿦

    View Slide

  117. (/%͸ෆ݈શ
    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))
    (/%͸DPFSDF
    Λܦ༝͢ΔΑ͏ʹ
    ()$͸ݡ͍ͷͰ
    BΛOPNJOBMʹਪ࿦ 3FKFDU

    View Slide


  118. View Slide

  119. 3PMFTͷొ৔Ͱ
    OFXUZQF͸

    ໾ׂΛՌͤΔΑ͏ʹ

    View Slide

  120. ໾ׂɿ

    View Slide

  121. ࣮૷ͷӅṭ

    View Slide

  122. ࣮૷ͷڞ༗

    View Slide

  123. ࣮૷ͷબ୒

    View Slide

  124. ͜Ε͕ݱࡏͷ

    ͍ ·
    OFXUZQF

    View Slide

  125. ͔͜͜Β͸
    ະདྷͷOFXUZQF
    ͷ࿩
    ͋ͨ͠

    View Slide

  126. OFXUZQFͷະདྷ
    ·ͨ͸ɺ%FSJWJOH7JB
    ͋ͨ͠

    View Slide

  127. OFXUZQFͷະདྷ
    ·ͨ͸ɺ%FSJWJOH7JB
    ʙ࣮૷ͷڞ༗ͱબ୒͕Ͱ͋͏ͱ͖ʙ
    [2] Blöndal, Löh and Scott, 2018
    ͋ͨ͠

    View Slide

  128. %FSJWJOH7JBΑΓॊೈͳ
    ࣮૷ͷڞ༗

    View Slide

  129. %FSJWJOH7JBΑΓॊೈͳ
    ࣮૷ͷڞ༗
    w ()$͔ΒೖΔ৽ػೳ

    View Slide

  130. %FSJWJOH7JBΑΓॊೈͳ
    ࣮૷ͷڞ༗
    w ()$͔ΒೖΔ৽ػೳ
    w ݱ࣌఺Ͱ()$BMQIB͕ग़͍ͯΔ

    View Slide

  131. %FSJWJOH7JBΑΓॊೈͳ
    ࣮૷ͷڞ༗
    w ()$͔ΒೖΔ৽ػೳ
    w ݱ࣌఺Ͱ()$BMQIB͕ग़͍ͯΔ
    w OFXUZQFΛEFSJWJOHઅͷώϯτͱͯ͠༻͍Δ
    ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ

    View Slide

  132. ྫɿ*EͷϞϊΠυߏ଄
    {-# LANGUAGE DerivingVia #-}
    newtype Id = MkId Word
    deriving (Semigroup, Monoid) via Max Word

    View Slide

  133. ྫɿ*EͷϞϊΠυߏ଄
    w લʹݟͨΑ͏ʹɺ8PSEͷϞϊΠυ࣮૷͸ෳ਺͋Δ
    {-# LANGUAGE DerivingVia #-}
    newtype Id = MkId Word
    deriving (Semigroup, Monoid) via Max Word

    View Slide

  134. ྫɿ*EͷϞϊΠυߏ଄
    w લʹݟͨΑ͏ʹɺ8PSEͷϞϊΠυ࣮૷͸ෳ਺͋Δ
    w *EͰ͸ʮҰ൪৽͍͠*E ࠷େͷ*E
    ΛબͿʯԋࢉΛϞϊΠυԋ
    ࢉͱͯ͠࢖͍͔ͨͬͨͱ͢Δ
    {-# LANGUAGE DerivingVia #-}
    newtype Id = MkId Word
    deriving (Semigroup, Monoid) via Max Word

    View Slide

  135. ྫɿ*EͷϞϊΠυߏ଄
    w લʹݟͨΑ͏ʹɺ8PSEͷϞϊΠυ࣮૷͸ෳ਺͋Δ
    w *EͰ͸ʮҰ൪৽͍͠*E ࠷େͷ*E
    ΛબͿʯԋࢉΛϞϊΠυԋ
    ࢉͱͯ͠࢖͍͔ͨͬͨͱ͢Δ
    w Max Word͸IdͱಉҰදݱɺ NBY
    ʹؔ͠ϞϊΠυ
    {-# LANGUAGE DerivingVia #-}
    newtype Id = MkId Word
    deriving (Semigroup, Monoid) via Max Word

    View Slide

  136. ྫɿ*EͷϞϊΠυߏ଄
    w લʹݟͨΑ͏ʹɺ8PSEͷϞϊΠυ࣮૷͸ෳ਺͋Δ
    w *EͰ͸ʮҰ൪৽͍͠*E ࠷େͷ*E
    ΛબͿʯԋࢉΛϞϊΠυԋ
    ࢉͱͯ͠࢖͍͔ͨͬͨͱ͢Δ
    w Max Word͸IdͱಉҰදݱɺ NBY
    ʹؔ͠ϞϊΠυ
    w %FSJWJOH7JB͸͜ͷ࣮૷Λࣗಈతʹ*Eʹ্࣋ͪ͛ͯ͘ΕΔʂ
    {-# LANGUAGE DerivingVia #-}
    newtype Id = MkId Word
    deriving (Semigroup, Monoid) via Max Word

    View Slide

  137. %FSJWJOH7JBWT(/%

    View Slide

  138. %FSJWJOH7JBWT(/%
    w %FSJWJOH7JB͸(/%ͷεʔύʔηοτ

    View Slide

  139. %FSJWJOH7JBWT(/%
    w %FSJWJOH7JB͸(/%ͷεʔύʔηοτ
    w (/%͸แ·ΕΔҰ൪಺ଆͷܕͷ࣮૷ΛݟΔ

    View Slide

  140. %FSJWJOH7JBWT(/%
    w %FSJWJOH7JB͸(/%ͷεʔύʔηοτ
    w (/%͸แ·ΕΔҰ൪಺ଆͷܕͷ࣮૷ΛݟΔ
    w %FSJWJOH7JB͸$PFSDJCMFͳ೚ҙͷܕͷ࣮
    ૷ΛɺίετθϩͰ࠶ར༻͢Δ͜ͱ͕Ͱ͖Δʂ

    View Slide

  141. %FSJWJOH7JBͷࣹఔ͸
    OFXUZQFʹݶΒͳ͍

    View Slide

  142. %FSJWJOH7JBͷࣹఔ͸
    OFXUZQFʹݶΒͳ͍
    w ݪ࿦จͰ͸೚ҙͷಉܕͳܕͷؒͰ࣮૷Λڞ༗
    ͢Δํ๏΋ఏҊ͞Ε͍ͯΔ
    ˞͜ͷlಉܕz͸ਖ਼֬ʹ͸ʮ૯শతͳදݱ͕$PFSDJCMFʯͱ͍͏΍΍ڧ͍৚݅

    View Slide

  143. %FSJWJOH7JBͷࣹఔ͸
    OFXUZQFʹݶΒͳ͍
    w ݪ࿦จͰ͸೚ҙͷಉܕͳܕͷؒͰ࣮૷Λڞ༗
    ͢Δํ๏΋ఏҊ͞Ε͍ͯΔ
    ૯শϓϩάϥϛϯάͱ$PFSDJPOͷ߹Θٕͤ
    ˞͜ͷlಉܕz͸ਖ਼֬ʹ͸ʮ૯শతͳදݱ͕$PFSDJCMFʯͱ͍͏΍΍ڧ͍৚݅

    View Slide

  144. %FNP
    +40/ม׵Πϯελϯεͷ੩తఆٛ
    ಉܕͳܕͷؒͰͷ࣮૷ͷڞ༗
    ˞$PNQMFUFDPEFJTBWBJMBCMFBUhttp://bit.ly/derivia

    View Slide

  145. ෳࡶͳྫ
    w ܕϨϕϧͰΤϯίʔυͷ࢓༷Λࢦఆ
    w '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

    View Slide

  146. ಉܕͷྫ
    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"]}
    -}

    View Slide

  147. ಉܕͷྫ 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

    View Slide

  148. %FSJWJOH7JB·ͱΊ

    View Slide

  149. %FSJWJOH7JB·ͱΊ
    w ()$͔Βར༻Մೳ

    View Slide

  150. %FSJWJOH7JB·ͱΊ
    w ()$͔Βར༻Մೳ
    w OFXUZQFΛ࢖ͬͯEFSJWJOHʹ࢖͏࣮૷Λબ୒
    ग़དྷΔ

    View Slide

  151. %FSJWJOH7JB·ͱΊ
    w ()$͔Βར༻Մೳ
    w OFXUZQFΛ࢖ͬͯEFSJWJOHʹ࢖͏࣮૷Λબ୒
    ग़དྷΔ
    w DPFSDFͱ(FOFSJDTͱ૊Έ߹ΘͤΕ͹ɺදݱ͕
    ಉ͡ͱ͸ݶΒͳ͍͕ಉܕͳܕͷ࣮૷΋ಋग़Մೳ

    View Slide

  152. %FSJWJOH7JB·ͱΊ
    w ()$͔Βར༻Մೳ
    w OFXUZQFΛ࢖ͬͯEFSJWJOHʹ࢖͏࣮૷Λબ୒
    ग़དྷΔ
    w DPFSDFͱ(FOFSJDTͱ૊Έ߹ΘͤΕ͹ɺදݱ͕
    ಉ͡ͱ͸ݶΒͳ͍͕ಉܕͳܕͷ࣮૷΋ಋग़Մೳ
    w ੍໿ͰදݱͰ͖ΔಉܕͳΒଞʹ΋ద༻Մೳ

    View Slide

  153. ·ͱΊ

    View Slide

  154. ·ͱΊ

    View Slide

  155. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ

    View Slide

  156. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒

    View Slide

  157. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒
    w %BUB$PFSDFΛ࢖͏ͱ಺෦දݱ͕ಉ͡ܕಉ࢜Λθϩ
    ίετͰΩϟετՄೳ

    View Slide

  158. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒
    w %BUB$PFSDFΛ࢖͏ͱ಺෦දݱ͕ಉ͡ܕಉ࢜Λθϩ
    ίετͰΩϟετՄೳ
    w OFXUZQFͷग़ੈ͸͔͜͜Β࢝·ͬͨ

    View Slide

  159. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒
    w %BUB$PFSDFΛ࢖͏ͱ಺෦දݱ͕ಉ͡ܕಉ࢜Λθϩ
    ίετͰΩϟετՄೳ
    w OFXUZQFͷग़ੈ͸͔͜͜Β࢝·ͬͨ
    w ෳ߹ܕ΋3PMFਪ࿦ɾḼऍͰద੾ʹѻ͑Δ

    View Slide

  160. ·ͱΊ
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒
    w %BUB$PFSDFΛ࢖͏ͱ಺෦දݱ͕ಉ͡ܕಉ࢜Λθϩ
    ίετͰΩϟετՄೳ
    w OFXUZQFͷग़ੈ͸͔͜͜Β࢝·ͬͨ
    w ෳ߹ܕ΋3PMFਪ࿦ɾḼऍͰద੾ʹѻ͑Δ
    w ()$͔Β%FSJWJOH7JBͰOFXUZQFʹΑΓ

    ಋग़અΛΧελϚΠζՄೳʹʂ

    View Slide

  161. ࢀߟจݙ
    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.

    View Slide

  162. ޚਗ਼ௌ

    ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide

  163. "OZ2VFTUJPO
    w OFXUZQFͷ༻్͸ࡾͭ
    w ࣮૷ͷӅṭʗ࣮૷ͷڞ༗ʗ࣮૷ͷબ୒
    w %BUB$PFSDFΛ࢖͏ͱ಺෦දݱ͕ಉ͡ܕಉ࢜Λθϩ
    ίετͰΩϟετՄೳ
    w OFXUZQFͷग़ੈ͸͔͜͜Β࢝·ͬͨ
    w ෳ߹ܕ΋3PMFਪ࿦ɾḼऍͰద੾ʹѻ͑Δ
    w ()$͔Β%FSJWJOH7JBͰOFXUZQFʹΑΓ

    ಋग़અΛΧελϚΠζՄೳʹʂ

    View Slide

  164. ͓·͚

    View Slide

  165. ͳͥ.POPJEͱ'PMEBCMF͸

    ஥͕͍͍ͷ͔ʁ
    w 'PMEBCMFͷ࠷খఆٛ
    w ࣮͸͜Ε͸ࣗ༝ϞϊΠυͷීวੑͷҰ෦͕༝དྷ
    class Foldable t where
    foldMap :: Monoid m 㱺 (a ! m) ! t a ! m

    View Slide

  166. 7 ↵ M

    '
    [ · ]
    9! 7QH/JT '
    AAAHwnicjVRNj9xEEK0dPiYMkGSBAxKXhk2iRHIGT0gEAs1qBQhxiZQPNok0HlYeu2fHGdtt3D1f6/WBK3+AAyeQEEL8DC78AQ75CYhjkLhw4HXZm9ld7c7G1tjdVe9Vvarq8SCLI21c98la44UXX3q5ee6V1quvvX7+wsX1Nx5oNckDuR2oWOWPBr6WcZTKbROZWD7Kcukng1g+HIw/s/6HU5nrSKVfmUUm+4m/m0bDKPANTDvra794A7kbpYWJxntZFJhJLsuWl/gmj+aiV7/VUGA1EqkKpXYE0k6SVGiZdTvtW0HiiFzNqm2Q9EXREmL/6he5lGJ4bV8UNtrImGJYesLz42zkl+IKEIl13i49j/EVtHbDVn7S8jIQe9c3nTD3Z30BGFBChruSlfT0zM8cf2KUM1Sp6Xo6yKPM6GhPQsQlb+rn2Si6VApkAtdeS+6SVhzilZbYg8wgVMYTfUuuC7HZ6yWH6YW+HsmwfzzcMRVfF56cY476XVRlG6GyZUNUHN72s7JE4ZXYslKL0mUaHpnJzsWNTtvlS5y+2Nh6i/i6o9Yb35JHISkKaEIJSUrJYB2TTxp3D++b9Jj6VNCA5lhpWHJgIkZJKqmFCBPYJWXwBTTGcxe7gvaY4QO9gG8VtkcjRMx5F0GD4owH/CH2VteqXHOoMXgajrIqU2VNsbf1as4UIEOMXw6moMvun+6v7lP3D/c39y/3vxVZbQzbpwXeg4ors50L3719/98zWQl3ZrRkrWCEsD5PFwaIutpvuzPG+qw4E64rA17hHmJ9tk7bWwPsR9xTO8eMLbbbQcWf7n3/9P7H9y4XV9yf3L/R5x/dJ+7v6HQ6/Sf4+a6898MKVfbUjXEqDis/sMV4V9XlmEbB50DyfB36AP1z2GOrmbFNo/M+n0q7q2aRI8YcuwC7GE8HPMlnI2d/xBPQ1GZldnYJ+zI+vSlUns5IOP+4xum6hgP1VSW27z6vY8ZJ6tJV/mfmXI2dvgBGwZIiUxWrssyRI6gxEuhrp2S4Tpv4vQ+05v9lzFmKE3Vb+3HdzjNLl5EC1SvYo2csgdi38JyxbYRVAR3L7hdQUPLt1FzDcz6c9agaWeNPqsdWbL9cMyAXJ9Q15W4soMLwlOx5cuouVDFbz/fVfHCj3XHbnbs3NrY+rT6fdI7eofcwoQ59SFv0Jd2hbQoa5xs3G93GZvPz5uPmN01dQRtrNedNOnI19/8HqpXY9Q==
    AAAHwnicjVRNj9xEEK0dPiYMkGSBAxKXhk2iRHIGT0gEAs1qBQhxiZQPNok0HlYeu2fHGdtt3D1f6/WBK3+AAyeQEEL8DC78AQ75CYhjkLhw4HXZm9ld7c7G1tjdVe9Vvarq8SCLI21c98la44UXX3q5ee6V1quvvX7+wsX1Nx5oNckDuR2oWOWPBr6WcZTKbROZWD7Kcukng1g+HIw/s/6HU5nrSKVfmUUm+4m/m0bDKPANTDvra794A7kbpYWJxntZFJhJLsuWl/gmj+aiV7/VUGA1EqkKpXYE0k6SVGiZdTvtW0HiiFzNqm2Q9EXREmL/6he5lGJ4bV8UNtrImGJYesLz42zkl+IKEIl13i49j/EVtHbDVn7S8jIQe9c3nTD3Z30BGFBChruSlfT0zM8cf2KUM1Sp6Xo6yKPM6GhPQsQlb+rn2Si6VApkAtdeS+6SVhzilZbYg8wgVMYTfUuuC7HZ6yWH6YW+HsmwfzzcMRVfF56cY476XVRlG6GyZUNUHN72s7JE4ZXYslKL0mUaHpnJzsWNTtvlS5y+2Nh6i/i6o9Yb35JHISkKaEIJSUrJYB2TTxp3D++b9Jj6VNCA5lhpWHJgIkZJKqmFCBPYJWXwBTTGcxe7gvaY4QO9gG8VtkcjRMx5F0GD4owH/CH2VteqXHOoMXgajrIqU2VNsbf1as4UIEOMXw6moMvun+6v7lP3D/c39y/3vxVZbQzbpwXeg4ors50L3719/98zWQl3ZrRkrWCEsD5PFwaIutpvuzPG+qw4E64rA17hHmJ9tk7bWwPsR9xTO8eMLbbbQcWf7n3/9P7H9y4XV9yf3L/R5x/dJ+7v6HQ6/Sf4+a6898MKVfbUjXEqDis/sMV4V9XlmEbB50DyfB36AP1z2GOrmbFNo/M+n0q7q2aRI8YcuwC7GE8HPMlnI2d/xBPQ1GZldnYJ+zI+vSlUns5IOP+4xum6hgP1VSW27z6vY8ZJ6tJV/mfmXI2dvgBGwZIiUxWrssyRI6gxEuhrp2S4Tpv4vQ+05v9lzFmKE3Vb+3HdzjNLl5EC1SvYo2csgdi38JyxbYRVAR3L7hdQUPLt1FzDcz6c9agaWeNPqsdWbL9cMyAXJ9Q15W4soMLwlOx5cuouVDFbz/fVfHCj3XHbnbs3NrY+rT6fdI7eofcwoQ59SFv0Jd2hbQoa5xs3G93GZvPz5uPmN01dQRtrNedNOnI19/8HqpXY9Q==
    AAAHwnicjVRLj9xEEK4dHhMGSLLAAYlLwyZRIjmDJyQCgWa1AoS4RMqDTSKNh5XH7tlxxi+6e17r9YErf4ADJ5AQQvwMLvwBDvkJiGOQuHDg67In+2B3FltjV1d/X9VXVT0e5HGkjes+WWs89/wLLzbPvdR6+ZVXz1+4uP7aA51NVCC3gyzO1KOBr2UcpXLbRCaWj3Il/WQQy4eD8Sd2/+FUKh1l6Rdmkct+4u+m0TAKfAPXzvraT95A7kZpYaLxXh4FZqJk2fIS36hoLnr1OxsKWCORZqHUjkDaSZIKLfNup30rSByhslm1DJK+KFpC7F/9TEkphtf2RWGjjYwphqUnPD/OR34prgCR2M3bpecxvoLW2/CVH7W8HMTe9U0nVP6sLwADSshwV7KSnp75ueNPTOYMs9R0PR2oKDc62pMQccmb+iofRZdKgUzg2uuAe0ArDvFKS+xBZhBmxhN9S64Lsdlrk8P0Ql+PZNg/Hu6Yii8LT84xR/02qrKNyPKDhmRxeNvPyxKFV2LLSi1Kl2l4ZCY7Fzc6bZcvcbqxsfUG8XUnW298TR6FlFFAE0pIUkoGdkw+adw9vG/SY+pTQQOaw9LwKGAiRkkqqYUIE/gl5dgLaIznLlYF7THDB3qBvVXYHo0QUfEqgoaMMy75Q6ytrlW55lBj8DQcZVWmyptibevVnClAhhg/Baagy+7v7s/uU/c39xf3D/efFVltDNunBd6DiivznQvfvHn/7zNZCXdmdMBawQjh/T9dGCDq6n3bnTHss+JMuK4c+Az3EPbZOm1vDbAfcE/tHHP22G4HFX+69+3T+x/eu1xccX9w/0Sfv3efuL+i0+n0r+DHu/LedytU2VM3xqk4rHzpi/GuqlOYRsHnQPJ8HXoP/XN4x1YzY59G530+lXZVzUIhxhyrAKsYTwc8yWdD8X7EE9DUZmV2dgnv5Xx6U6g8nZFw/nGN03UNS/VVJbbvPtsx4yR16Sr/MxVXY6cvgMngSZGpilV55sgR1BgJ9LVTMlynTfzeBVrz/zLmLMWJuq3/uG7nmafLSIHqM/ijZyyB2LfwnLFvBKuAjoPuF1BQ8u3UXMNzPpz1qBpZ40+qx1Zsv1wzIBcn1DXlbiygwvCU7Hly6i5UMVv4arrLb+R/jeVX88GNdsdtd+7e2Nj6uPp80jl6i97BhDr0Pm3R53SHtilonG/cbHQbm81Pm4+bXzV1BW2s1ZzX6cjV3P8XqT/Y8g==
    AAAHwnicjVRLj9xEEK4dHhMGSLLAAYlLwyZRIjmDJyQCgWa1AoS4RMqDTSKNh5XH7tlxxi+6e17r9YErf4ADJ5AQQvwMLvwBDvkJiGOQuHDg67In+2B3FltjV1d/X9VXVT0e5HGkjes+WWs89/wLLzbPvdR6+ZVXz1+4uP7aA51NVCC3gyzO1KOBr2UcpXLbRCaWj3Il/WQQy4eD8Sd2/+FUKh1l6Rdmkct+4u+m0TAKfAPXzvraT95A7kZpYaLxXh4FZqJk2fIS36hoLnr1OxsKWCORZqHUjkDaSZIKLfNup30rSByhslm1DJK+KFpC7F/9TEkphtf2RWGjjYwphqUnPD/OR34prgCR2M3bpecxvoLW2/CVH7W8HMTe9U0nVP6sLwADSshwV7KSnp75ueNPTOYMs9R0PR2oKDc62pMQccmb+iofRZdKgUzg2uuAe0ArDvFKS+xBZhBmxhN9S64Lsdlrk8P0Ql+PZNg/Hu6Yii8LT84xR/02qrKNyPKDhmRxeNvPyxKFV2LLSi1Kl2l4ZCY7Fzc6bZcvcbqxsfUG8XUnW298TR6FlFFAE0pIUkoGdkw+adw9vG/SY+pTQQOaw9LwKGAiRkkqqYUIE/gl5dgLaIznLlYF7THDB3qBvVXYHo0QUfEqgoaMMy75Q6ytrlW55lBj8DQcZVWmyptibevVnClAhhg/Baagy+7v7s/uU/c39xf3D/efFVltDNunBd6DiivznQvfvHn/7zNZCXdmdMBawQjh/T9dGCDq6n3bnTHss+JMuK4c+Az3EPbZOm1vDbAfcE/tHHP22G4HFX+69+3T+x/eu1xccX9w/0Sfv3efuL+i0+n0r+DHu/LedytU2VM3xqk4rHzpi/GuqlOYRsHnQPJ8HXoP/XN4x1YzY59G530+lXZVzUIhxhyrAKsYTwc8yWdD8X7EE9DUZmV2dgnv5Xx6U6g8nZFw/nGN03UNS/VVJbbvPtsx4yR16Sr/MxVXY6cvgMngSZGpilV55sgR1BgJ9LVTMlynTfzeBVrz/zLmLMWJuq3/uG7nmafLSIHqM/ijZyyB2LfwnLFvBKuAjoPuF1BQ8u3UXMNzPpz1qBpZ40+qx1Zsv1wzIBcn1DXlbiygwvCU7Hly6i5UMVv4arrLb+R/jeVX88GNdsdtd+7e2Nj6uPp80jl6i97BhDr0Pm3R53SHtilonG/cbHQbm81Pm4+bXzV1BW2s1ZzX6cjV3P8XqT/Y8g==
    AAAHwnicjVRLj9xEEK4dHhMGSLLAAYlLwyZRIjmDJyQCgWa1AoS4RMqDTSKNh5XH7tlxxi+6e17r9YErf4ADJ5AQQvwMLvwBDvkJiGOQuHDg67In+2B3FltjV1d/X9VXVT0e5HGkjes+WWs89/wLLzbPvdR6+ZVXz1+4uP7aA51NVCC3gyzO1KOBr2UcpXLbRCaWj3Il/WQQy4eD8Sd2/+FUKh1l6Rdmkct+4u+m0TAKfAPXzvraT95A7kZpYaLxXh4FZqJk2fIS36hoLnr1OxsKWCORZqHUjkDaSZIKLfNup30rSByhslm1DJK+KFpC7F/9TEkphtf2RWGjjYwphqUnPD/OR34prgCR2M3bpecxvoLW2/CVH7W8HMTe9U0nVP6sLwADSshwV7KSnp75ueNPTOYMs9R0PR2oKDc62pMQccmb+iofRZdKgUzg2uuAe0ArDvFKS+xBZhBmxhN9S64Lsdlrk8P0Ql+PZNg/Hu6Yii8LT84xR/02qrKNyPKDhmRxeNvPyxKFV2LLSi1Kl2l4ZCY7Fzc6bZcvcbqxsfUG8XUnW298TR6FlFFAE0pIUkoGdkw+adw9vG/SY+pTQQOaw9LwKGAiRkkqqYUIE/gl5dgLaIznLlYF7THDB3qBvVXYHo0QUfEqgoaMMy75Q6ytrlW55lBj8DQcZVWmyptibevVnClAhhg/Baagy+7v7s/uU/c39xf3D/efFVltDNunBd6DiivznQvfvHn/7zNZCXdmdMBawQjh/T9dGCDq6n3bnTHss+JMuK4c+Az3EPbZOm1vDbAfcE/tHHP22G4HFX+69+3T+x/eu1xccX9w/0Sfv3efuL+i0+n0r+DHu/LedytU2VM3xqk4rHzpi/GuqlOYRsHnQPJ8HXoP/XN4x1YzY59G530+lXZVzUIhxhyrAKsYTwc8yWdD8X7EE9DUZmV2dgnv5Xx6U6g8nZFw/nGN03UNS/VVJbbvPtsx4yR16Sr/MxVXY6cvgMngSZGpilV55sgR1BgJ9LVTMlynTfzeBVrz/zLmLMWJuq3/uG7nmafLSIHqM/ijZyyB2LfwnLFvBKuAjoPuF1BQ8u3UXMNzPpz1qBpZ40+qx1Zsv1wzIBcn1DXlbiygwvCU7Hly6i5UMVv4arrLb+R/jeVX88GNdsdtd+7e2Nj6uPp80jl6i97BhDr0Pm3R53SHtilonG/cbHQbm81Pm4+bXzV1BW2s1ZzX6cjV3P8XqT/Y8g==
    AAAHwnicjVRNj9xEEK2dABMGSLLhgsSlYZMokZzBExKBQLOKACEukfLBJpHGw8pj9+w4Y7uNu+dj1+sDV/4AB04gIYT4GVz4AxzyExDHIHHhwOuyJ7O72Z3F1tjV1e9Vvarq8SCLI21c9+la48xLL7/SPPtq67XX3zh3/sL6xYdaTfJAbgUqVvnjga9lHKVyy0Qmlo+zXPrJIJaPBuNP7f6jqcx1pNIvzW4m+4m/k0bDKPANXNvraz97A7kTpYWJxntZFJhJLsuWl/gmj+aiV7/VUMAaiVSFUjsCaSdJKrTMup32rSBxRK5m1TJI+qJoCbF/9fNcSjG8ti8KG21kTDEsPeH5cTbyS3EFiMRu3ik9j/EVtN6Gr/y45WUg9q5vOmHuz/oCMKCEDHckK+npmZ85/sQoZ6hS0/V0kEeZ0dGehIhL3tTPs1F0qRTIBK69ltwlrTjAKy2xB5lBqIwn+pZcF2Kz1yaH6YW+HsmwfzTcERVfFZ6cY476HVRlG6GyZUNUHN7xs7JE4ZXYslKL0mUaHprJ9oWNTtvlS5xsbFB93VXrjW/Io5AUBTShhCSlZGDH5JPG3cP7Jj2hPhU0oDksDU8OTMQoSSW1EGECv6QMewGN8dzBqqA9ZvhA72JvFbZHI0TMeRVBg+KMC/4Qa6trVa451Bg8DUdZlanypljbejVnCpAhxi8HU9Bl9w/3F/eZ+7v7q/un+++KrDaG7dMu3oOKK7Pt89++9eCfU1kJd2a0ZK1ghPD+ny4MEHX1vu3OGPZpcSZcVwa8wj2EfbpO21sD7IfcUzvHjD2220HFn+599+zBR/cvF1fcH92/0Ocf3Kfub+h0Ov07+OmevP/9ClX21I1xKg4qX/hivKvqckyj4HMgeb4OvY/+Obxjq5mxT6PzPp9Ku6pmkSPGHKsAqxhPBzzJZyPn/YgnoKnNyuzsEt7L+PSmUHkyI+H84xqn6xoW6qtKbN99tmPGSerSVf5n5lyNnb4ARsGTIlMVq/LMkSOoMRLoaydkuE6b+L0HtOb/ZcxZimN1W/9R3c5zT5eRAtUr+KPnLIHYt/CcsW8Eq4COZfcLKCj5dmqu4TkfzHpYjazxx9VjK7ZfrhmQu8fUNeVu7EKF4SnZ8+TUXahitvDVdBffyBeNxVfz4Y12x2137t3YuP1J/f08S2/Tu5hQhz6g2/QF3aUtChrnGjcb3cZm87Pmk+bXTV1BG2s15006dDX3/wPW8die
    ࣗ༝Ϟφυͷීวੑ
    w ࣗ༝ϞϊΠυവखͷఆ͔ٛΒ
    w α͔ΒGα΁ͷೖࣹ
    w G͕വखͰ͋Δ͜ͱ
    w Gαࣗ਎͕ϞϊΠυͰ͋Δࣄ
    w ʜʜΛআ͘ͱ'PMEBCMFʹͳΔ
    w ௚઀࡞Δํ๏͕ͳͯ͘΋͍͍
    w Hask ݍͷവखͱ͸ݶΒͳ͍
    w ϞϊΠυͱ͸ݶΒͳ͍ɺ୯ͳΔ
    ໦ߏ଄Ͱ΋৞ΈࠐΈ͍ͨ

    View Slide

  167. 'PMEBCMFͱ5SBWFSTBCMF
    w 5SBWFSTBCMF͸ࣗ༝ϞϊΠυͱ'PMEBCMFͷதؒ
    w USBWFSTF͸ࣗ༝ϞϊΠυͳΒ؆୯ʹॻ͚Δ
    class (Pointed f, Foldable f, ∀a. Monoid (f a)) 㱺 FreeMonoid f
    instance (Pointed f, Foldable f, ∀a. Monoid (f a)) 㱺 FreeMonoid f
    fold :: (FreeMonoid f) 㱺 (a ! b ! b) ! b ! f a ! b
    fold g n xs = appEndo (foldMap (Endo . g) xs) n
    traverseF :: (FreeMonoid f, Applicative t)
    㱺 (a ! t b) ! f a ! t (f b)
    traverseF f = fold (λa tb ! (<>) <$> (iota <$> f a) <*> tb)
    (pure mempty)
    ͔ΒೖΔ
    QuantifiedConstraints
    $PNQMFUFDPEFɿsrc/Data/Foldable/Monoid.hs

    View Slide