Slide 1

Slide 1 text

֦ுՄೳΠϯλϓϦλ .-Ͱͭ͘Δ ML Day #1 1 Takahisa Watanabe @linerlock

Slide 2

Slide 2 text

ࠓ೔ͷ಺༰ ϞδϡϥʔͳϓϩάϥϜݴޠ։ൃ 2 ϕʔεݴޠ ֦ ு ֦ ு ໨తͷϓϩάϥϜݴޠ l.-Ͱͷ֦ுՄೳΠϯλϓϦλߏ੒ख๏

Slide 3

Slide 3 text

&YQSFTTJPO1SPCMFN ੩తܕ෇͖ͷϓϩάϥϜݴޠͰ  ιʔείʔυΛʮฤूͤͣʯʹσʔλܕ΍खଓ͖Λ௥ՃͰ͖Δ͔  3 The Expression Problem is a new name for an old problem. The goal is to define a datatype by cases, where one can add new cases to the datatype and new functions over the datatype, without recompiling existing code, and while retaining static type safety (e.g., no casts). http://homepages.inf.ed.ac.uk/wadler/papers/expression/expression.txt Expression Problem Extensibility

Slide 4

Slide 4 text

֦ுՄೳΠϯλϓϦλ FYUFOTJCMF JOUFSQSFUFS l ΠϯλϓϦλ։ൃʹ͓͚Δ&YQSFTTJPO1SPCMFNͷղ 4 ධՁث ऴλάϨε๏ 0QFOSFDVSTJPO 0CKFDUBMHFCSB ߏจղੳث ཱ֬͞Εͨख๏͸ͳ͍ ߏจղੳثੜ੒ܥΛ࢖͏ͱ͍͏खஈ͸͋Δ͕ ࠓճͷٞ࿦ͷର৅ʹ͸ؚΊͳ͍

Slide 5

Slide 5 text

֦ுՄೳΠϯλϓϦλ l ΠϯλϓϦλ։ൃʹ͓͚Δ&YQSFTTJPO1SPCMFNͷղ 5 ධՁث ऴλάϨε๏ 0QFOSFDVSTJPO 0CKFDUBMHFCSB ߏจղੳث ཱ֬͞Εͨख๏͸ͳ͍ ߏจղੳثੜ੒ܥΛ࢖͏ͱ͍͏खஈ͸͋Δ͕ ࠓճͷٞ࿦ͷର৅ʹ͸ؚΊͳ͍ ͜͜Λ΍Γ͍ͨ

Slide 6

Slide 6 text

ൃදͷྲྀΕ l લ൒֦ுՄೳͳධՁثͷ࣮ݱख๏ͷ঺հ n&YUFOTJCMFWBSJBOUUZQFT n &YQSFTTJPO1SPCMFNJO'1 n0QFOSFDVSTJPOΫϥεʹΑΔ֦ுΠϯλϓϦλ lޙ൒֦ுՄೳͳߏจղੳثͷ࣮ݱख๏ͷఏҊ nࣗ࡞ϥΠϒϥϦGJOBMFͷ঺հ 6

Slide 7

Slide 7 text

֦ுՄೳͳධՁثͷ࣮ݱ 7

Slide 8

Slide 8 text

֦ுՄೳΠϯλϓϦλ 8 l ର৅ݴޠΛ੩తʹ֦ுՄೳͳΠϯλϓϦλ lର৅ݴޠͷ֦ுΛͲ͏΍ͬͯදݱ͢Δ   type e = Lam of string * e | App of e * e | Var of string | Int of int ௥Ճ

Slide 9

Slide 9 text

֦ுՄೳΠϯλϓϦλ 9 l ର৅ݴޠΛ੩తʹ֦ுՄೳͳΠϯλϓϦλ lର৅ݴޠͷ֦ுΛͲ͏΍ͬͯදݱ͢Δ   type e = Lam of string * e | App of e * e | Var of string | Int of int ௥Ճ 0$BNMʹ͸ͦͷͨΊͷػೳ͕͋Δ

Slide 10

Slide 10 text

&YUFOTJCMFWBSJBOUUZQFT l։͔Εͨz୅਺తσʔλܕ ü ίϯετϥΫλΛޙ͔Β௥ՃՄೳ üྫ֎ܕexnͷҰൠԽ એݴ type t = .. ίϯετϥΫλͷ௥Ճ ݱࡏͷείʔϓͰͷΈ༗ޮʹͳΔ  type t += A type t += B of int | C 10

Slide 11

Slide 11 text

ສࣄղܾ͔ l /0 lίϯετϥΫλ͕଍ͤΔ͚ͩͰ͸ &YQSFTTJPO1SPCMFNͷղʹ͸ͳΒͳ͍ 11

Slide 12

Slide 12 text

&YQSFTTJPO1SPCMFNJO'1 12 データ型の追加 手続きの追加 FP OOP l ୅਺తσʔλܕίϯετϥΫλΛ૿΍͢ͱ ؔ܎͢ΔશͯͷύλʔϯϚονʹʮฤूʯ͕ඞཁ l खଓ͖ͷ௥Ճ͸؆୯ ؔ਺Λ৽͘͠ఆٛ͢Δ͚ͩ '1ʹ͓͚Δ&YQSFTTJPO1SPCMFN

Slide 13

Slide 13 text

ྫ୊ type e = .. type e += Int of int | Add of e * e let rec eval = function | Int n -> n | Add (n, m) -> eval n + eval m 13

Slide 14

Slide 14 text

ྫ୊खଓ͖ͷ௥Ճ type e = .. type e += Int of int | Add of e * e let rec eval = function | Int n -> n | Add (n, m) -> eval n + eval m let rec show = function | Int n -> sprintf “%d” n | Add (n, m) -> sprintf “(%s+%s)” (show n) (show m) 14

Slide 15

Slide 15 text

ྫ୊σʔλܕͷ௥Ճ type e = .. type e += Int of int | Add of e * e type e += Sub of e * e let rec eval = function | Int n -> n | Add (n, m) -> eval n + eval m | Sub (n, m) -> eval n – eval m let rec show = function | Int n -> sprintf “%d” n | Add (n, m) -> sprintf “(%s + %s)” (show n) (show m) | Sub (n, m) -> sprintf “(%s - %s)” (show n) (show m) 15 ੺ࣈͷ෦෼͸ιʔείʔυͷ ฤूʹΑΔରԠ͕ඞཁ

Slide 16

Slide 16 text

΍Γ͍ͨ͜ͱ 16 let rec eval = function | Int n -> n | Add (n, m) -> eval n + eval m let rec eval_sub = function | Sub (n, m) -> eval_sub n – eval_sub m | e -> eval e • ֦ுͨ͠෦෼͚ͩΛॲཧ͢Δखଓ͖Λ௥Ճ • ֦ுͨ͠෦෼Ҏ֎ͷॲཧ͸طଘͷखଓ͖ʹॲཧΛҕৡ ҕৡ

Slide 17

Slide 17 text

໰୊ 17 let rec eval = function | Int n -> n | Add (n, m) -> eval n + eval m let rec eval_sub = function | Sub (n, m) -> eval_sub n – eval_sub m | e -> eval e • evalؔ਺ͷ࠶ؼݺͼग़͠Ҏ߱, eval_subؔ਺͕ݺ͹Εͳ͍ • ໰୊ͱͳΔྫAdd (Sub (Int 1, Int 2), Int 3) ҕৡ

Slide 18

Slide 18 text

PQFOSFDVSTJPOʹΑΔղܾ ll։͔Εͨz࠶ؼؔ਺ l࠶ؼݺͼग़͠ͷෆಈ఺Λύϥϝʔλͱͯ͠ड͚ͱΔ 18 let eval_open = fun eval -> | Int n -> n | Add (n, m) -> eval n + eval m

Slide 19

Slide 19 text

ྫ୊΁ͷద༻ let eval_open = fun eval -> | Int n -> n | Add (n, m) -> eval n + eval m let eval_sub_open = fun eval -> | Sub (n, m) -> eval n – eval m | e -> eval_open eval e 19

Slide 20

Slide 20 text

5ZJOHUIFLOPU l࠷ޙʹ։͔Εͨ࠶ؼؔ਺Λlด͡Δzఆ͕ٛඞཁ 20 let rec eval e = eval_sub_open eval e PQFOSFDVSTJPOؔ਺ͷ࠶ؼݺͼग़͕͠ શͯ͜ͷevalΛࢦ͢Α͏ʹͳΔ

Slide 21

Slide 21 text

໰୊ l PQFOSFDVSTJPO͸ॻ͘ͷ͕ͭΒ͍ lྫ૬ޓ࠶ؼؔ਺ෆಈ఺ͷ਺͚ͩҾ਺͕૿͑Δ 21

Slide 22

Slide 22 text

ผղΫϥεʹΑΔ࣮ݱ l खଓ͖ΛΫϥεͷϝιουͱͯ͠දݱ lखଓ͖ͷ௥Ճ͸ܧঝʹΑ࣮ͬͯݱ l ࣗݾࢀর UIJT ͸ৗʹܧঝπϦʔͷ༿Λࢦ͢ n ஗ԆόΠϯσΟϯά n PQFOSFDVSTJPOͱಉ༷ͷ࢓૊ΈΛ࣮ݱͰ͖Δ  22

Slide 23

Slide 23 text

ྫ୊ΫϥεʹΑΔ࣮ݱ 23 class add_or_int = object (this) method eval = function | Int n -> n | Add (n, m) -> this#eval n + this#eval m end class sub = object (this) inherit add_or_sub as super method eval = function | Sub (n, m) -> this#eval n – this#eval m | e -> super#eval e end ݱࡏͷखଓ͖ͰΧόʔ͠ͳ͍ཁૉ͸਌ʹॲཧΛҕৡ

Slide 24

Slide 24 text

ΫϥεʹΑΔ࣮ݱ͸ྑ͍ղ͔ 001ݴޠͰॻ͘ͷͱԿ͕ҧ͏ͷ  l001Ͱ͸ΫϥεΛ༻͍ͯσʔλܕͷදݱ΋ߦ͏ &YUFOTJCMFWBSJBOUUZQFT Ϋϥε l'1σʔλܕ 001ʹΑΔखଓ͖ͷ֦ு lهड़ੑ͸ߴ͍ l001ͷ&YQSFTTJPO1SPCMFN͕࠶೩͢Δ 24

Slide 25

Slide 25 text

લ൒ͷ·ͱΊ l l։͔Εͨzσʔλܕͱ࠶ؼؔ਺͕͋Ε͹ ΠϯλϓϦλ ධՁث ͸֦ுͰ͖Δ lσʔλܕFYUFOTJCMFUZQFWBSJBOUT l࠶ؼؔ਺ lPQFOSFDVSTJPO lΫϥε 25

Slide 26

Slide 26 text

֦ுՄೳͳߏจղੳثͷ࣮ݱ 26

Slide 27

Slide 27 text

֦ுՄೳΠϯλϓϦλ l ΠϯλϓϦλ։ൃʹ͓͚Δ&YQSFTTJPO1SPCMFNͷղ 27 ධՁث ऴλάϨε๏ 0QFOSFDVSTJPO 0CKFDUBMHFCSB ߏจղੳث ཱ֬͞Εͨख๏͸ͳ͍ ߏจղੳثੜ੒ܥΛ࢖͏ͱ͍͏खஈ͸͋Δ͕ ࠓճͷٞ࿦ͷର৅ʹ͸ؚΊͳ͍ ͜͜Λ΍Γ͍ͨ

Slide 28

Slide 28 text

࣮ݱͷΞΠσΞ ϓϦϯλ͸֦ுՄೳΠϯλϓϦλʹج͍ͮͯఆٛՄೳ ϓϦϯλͱߏจղੳث͸ରͷؔ܎ʹ͋Δ Parse x = Parse (Print (Parse x)) 28 ֦ுՄೳΠϯλϓϦλͱͯ͠ఆٛͨ͠ϓϦϯλ͔Β ֦ுߏจثΛಋग़Ͱ͖ͳ͍͔

Slide 29

Slide 29 text

ߏจղੳثͱϓϦϯλ 29 ߏจղੳث ϓϦϯλ ԋࢉࢠͷ༏ઌॱҐ ԋࢉࢠͷ݁߹ํ޲ º ߏจղੳث೚ҙͷೖྗ͔Βߏจ໦Λ࡞Δ ϓϦϯλ༩͑ΒΕͨߏจ໦Λ୧ͬͯจࣈྻΛ࡞Δ ߏจ໦ͷ૊ΈཱͯํΛ஌͓ͬͯ͘ඞཁ͕ͳ͍ ϓϦϯλʹରͯ͠ߏจղੳʹඞཁͳ৘ใΛ෇͚Ճ͍͑ͯ͘ ߏจղੳث ϓϦϯλ

Slide 30

Slide 30 text

ߏจղੳثͱϓϦϯλ 30 ߏจղੳث ϓϦϯλ ԋࢉࢠͷ༏ઌॱҐ ԋࢉࢠͷ݁߹ํ޲ *OWFSUJCMF4ZOUBYߏจղੳثͱϓϦϯλΛಉ࣌ʹఆٛ

Slide 31

Slide 31 text

finale : *OWFSUJCMF4ZOUBYGPS.- 31 http://github.com/takahisa/finale ߏจղੳثͱϓϦϯλΛಉ࣌ʹఆٛՄೳ "QQMJDBUJWF1BSTFSDPNCJOBUPSͬΆ͍ελΠϧ let jboolean = jbooleanE <$> (text "true" *> pure (=) true) <|> jbooleanE <$> (text "false" *> pure (=) false) ྫ+40/ਅِ஋Ϧςϥϧͷߏจఆٛ • ऴλάϨε๏ʹΑΔܕ҆શͳݴޠ಺%4-ͱ࣮ͯ͠૷ • ϞδϡϥʔͳߏจղੳϓϦϯτͷͨΊͷػೳΛఏڙ

Slide 32

Slide 32 text

Ϟδϡϥʔͳߏจղੳʹ޲͚ͯ lύʔαϓϦϯλͷ֦ு๏͸લ൒ͱಉ͡ lͨͩ͠ lਖ਼͍݁͠ՌzΛಘΔͨΊʹ͸޻෉͕ඞཁ   32 • Modular parsers should support left-recursion. • Modular parsers should use a longest match composition operator 5ZQF4BGF.PEVMBS1BSTJOH<;IBOH >  • ࠨ࠶ؼ • ࠷௕Ұக

Slide 33

Slide 33 text

Ϟδϡϥʔͳߏจղੳͷ໰୊ 33 ॱ൪ʹؔ͢Δ໰୊ FYQ JOU Լʹ௥Ճ نଇͷ௥ՃΛߦ͏ͱʜ FYQ JOU c JOU b `FYQ FYQ JOU b `FYQ cJOU ্ʹ௥Ճ

Slide 34

Slide 34 text

Ϟδϡϥʔͳߏจղੳͷ໰୊ 34 ॱ൪ʹؔ͢Δ໰୊ FYQ JOU Լʹ௥Ճ نଇͷ௥ՃΛߦ͏ͱʜ FYQ JOU c JOU b `FYQ FYQ JOU b `FYQ cJOU ্ʹ௥Ճ Լͷنଇʹ ӬԕʹભҠ͠ͳ͍

Slide 35

Slide 35 text

Ϟδϡϥʔͳߏจղੳͷ໰୊ l֦ுͷ૊Έ߹ΘͤํʹΑͬͯ݁Ռ͕มΘΔ lDPNQPTBCJMJUZͷ؍఺͔Β޷·͘͠ͳ͍ lFSSPSQSPOF l࠷௕Ұக๏ʹΑΔղ l શ෦ࢼ͢࠷΋ೖྗΛফඅͨ͠نଇΛબͿ lޮ཰͸ѱ͍DPNQPTBCJMJUZͱͷτϨʔυΦϑ 35

Slide 36

Slide 36 text

ࠨ࠶ؼͷ໰୊ l QBSTFSDPNCJOBUPSҰൠͷ໰୊ lԋࢉࢠͷ༏ઌॱҐ෇͖QBSTJOHͳͲͰසग़ l֦ுʹΑͬͯ༧ظͤ͵ࠨ࠶ؼ͕ൃੜ͕ͪ͠ lଈࢮ 36

Slide 37

Slide 37 text

ࠨ࠶ؼ΁ͷରॲ l -FGUSFDVSTJPOFMJNJOBUJPO l ΍Γ͍͕ͨʜ l ࠓճ͸සग़ύλʔϯͰ͋ΔԋࢉࢠͷॱҐ෇͖จ๏ͷ QBSTJOHʹϐϘοτ 37

Slide 38

Slide 38 text

ԋࢉࢠॱҐղੳ l ԋࢉࢠͷ༏ઌॱҐɾ݁߹ํ޲ͷςʔϒϧ͔Β ࣜͷߏจղੳΛߦ͏ lࠓ͸JOWFSUJCMFTZOUBYͷ্Ͱ΍͍ͬͯΔ lԋࢉࢠॱҐϓϦϯλͬͯԿͩʜ  lߟ͑ͨ͘ͳ͍ͷͰ ࠶ؼԼ߱ߏจղੳثΛ ,OPUΛด͡ΔλΠϛϯάͰੜ੒ 38

Slide 39

Slide 39 text

,FOOFM IUUQTHJUIVCDPNUBLBIJTBLFOOFM l ຊ೔঺հͨ͠಺༰ͷ૊Έ߹ΘͤʹΑΔ ֦ுՄೳͳΠϯλϓϦλ։ൃϑϨʔϜϫʔΫ lݱࡏϥϜμܭࢉ਺஋ܕਅِ஋ܕԋࢉͳͲΛ૊Έ ߹Θͤͯͪΐͬͱͨ͠࠶ؼؔ਺͕ॻ͚Δ 39

Slide 40

Slide 40 text

·ͱΊ l ֦ுՄೳΠϯλϓϦλͷߏஙख๏ʹ͍ͭͯ঺հ lࣗ࡞ϥΠϒϥϦGJOBMFʹ͍ͭͯͷ঺հ lJOWFSUJCMFTZOUBY NPEVMBSQBSTJOH 40 ໺๬ • ϓϩάϥϜݴޠॲཧܥશମΛ֦ுՄೳʹ͍ͨ͠ • ΧόʔͰ͖͍ͯͳ͍෦෼ܕݕࠪثϓϩάϥϜม׵ ࠷దԽث ͳͲ • ͓஌ܙΛ͓ି͍ͩ͘͠͞