Slide 1

Slide 1 text

Θ͍Θ͍swiftc #8 @ukitaka switchͷexhaustiveness/redundancy νΣοΫ ཧ࿦ͱ࣮૷

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

switchͷ໢ཏੑ/৑௕ੑνΣοΫ ࠓ೔ͷ࿩ ▸ swiftc͕͍͔ʹͯ͠switchͷ໢ཏੑνΣοΫΛ͍ͯ͠Δ͔Λɺഎܠʹ͋ΔSpaceͱ ͍͏֓೦Λݩʹͨ͠ύλʔϯϚονͷ໢ཏੑνΣοΫͷཧ࿦ͱͦͷ࣮૷ʹ͍ͭ ͯɺlib/Sema/TypeCheckSwitchStmt.cppͱιʔείʔυதͰ঺հ͞Ε͍ͯΔ࿦ จΛݩʹ঺հͯ͠Έ͍ͨͱࢥ͍·͢ɻ

Slide 5

Slide 5 text

switchͷ໢ཏੑ/৑௕ੑνΣοΫ ࠓ೔ͷ࿩

Slide 6

Slide 6 text

switchΛ஌Δ

Slide 7

Slide 7 text

switch ໢ཏੑνΣοΫ

Slide 8

Slide 8 text

switch ଍Γͳ͍caseͷ௥Ճ

Slide 9

Slide 9 text

switch ΋͏গ͠ෳࡶͳέʔεͰ΋Մ

Slide 10

Slide 10 text

switch ଍Γͳ͍caseͷ௥Ճ

Slide 11

Slide 11 text

switch Unreachableͳέʔε͸লུՄೳ

Slide 12

Slide 12 text

switch where۟Λ࢖͏ͱ࣮ࡍʹ͸໢ཏ͞Ε͍ͯͯ΋Τϥʔʹ

Slide 13

Slide 13 text

switch IntͳͲ͸໢ཏ͞Ε͍ͯͯ΋Τϥʔʹ

Slide 14

Slide 14 text

switch ৑௕ͳέʔε͕͋ΔͱwarningʹͳΔ

Slide 15

Slide 15 text

switch SwitchͷεϖοΫ ▸ έʔε͕໢ཏ͞Ε͍ͯΔ͜ͱΛݕࠪͰ͖ɺ໢ཏ͞Ε͍ͯͳ͍৔߹͸Τϥʔʹ͢Δ ▸ ͦͷࡍ(ิ׬͢ΔͨΊʹ)Ͳͷέʔε͕଍Γͳ͍͔Λ೺ѲͰ͖͍ͯΔඞཁ͕͋Δ ▸ ॏෳ͢Δέʔε΋ݕग़Ͱ͖Δඞཁ͕͋Δ → ͜ΕΛ࣮ݱ͍ͯ͠Δͷ͕Space (Engine)ͱݺ͹ΕΔ࢓૊Έ

Slide 16

Slide 16 text

Space EngineΛ༻ ͍ͨ໢ཏੑνΣοΫ

Slide 17

Slide 17 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ TypeCheckSwitchStmt.cpp

Slide 18

Slide 18 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ TypeCheckSwitchStmt.cpp

Slide 19

Slide 19 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ TypeCheckSwitchStmt.cpp

Slide 20

Slide 20 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ TypeCheckSwitchStmt.cpp

Slide 21

Slide 21 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ ࢀߟจݙ ▸ Maranget, Luc. "Warnings for pattern matching." Journal of Functional Programming 17.3 (2007): 387-421. ▸ ͜Ε͕ԼͷPaperͷϕʔεͱͳͬͨ࿦จ ▸ (GenericͰͳ͍) ୅਺తσʔλܕΛѻ͑ΔܕγεςϜʹ͓͚Δ໢ཏੑνΣοΫͷΞϧΰϦζϜ ▸ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ▸ ͕ͬͪ͜SpaceΛ࢖ͬͨ໢ཏੑݕࠪʹؔ͢Δ࿦จɺ͜ΕΛԠ༻ͯ͠৑௕ੑݕࠪ΋ߦ͏ ▸ ಛఆͷܕγεςϜʹґଘ͠ͳ͍ΞϧΰϦζϜ ( GADTs΋ѻ͑Δ )

Slide 22

Slide 22 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ A Generic Algorithm for Checking Exhaustivity of Pattern Matching ▸ ݩʑ͸Dottyͱ͍͏ScalaͷίϯύΠϥ (Scala 3.0~)Ͱ࠾༻͞Ε͍ͯΔ΋ͷΛSwift ʹҠ২͖ͯͨ͠΋ͷɻ https://fengy.me/

Slide 23

Slide 23 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ A Generic Algorithm for Checking Exhaustivity of Pattern Matching ▸ ໢ཏੑνΣοΫͷΞϧΰϦζϜΛಛఆͷܕγεςϜ͔Β੾Γ཭͠ɺͲͷΑ͏ͳݴ ޠ(ͷܕγεςϜ)Ͱ΋࢖͑ΔΑ͏ͳҰൠతͳΞϧΰϦζϜΛఏڙ͢Δ ▸ ྫͱͯ͠Scala (Dotty) ͷܕγεςϜ΁ͷԠ༻Λ͍ࣔͯ͠Δ ▸ ϑΥʔϚϧͳূ໌͕͋ΔΘ͚Ͱ͸ͳ͍͚Ͳɺ͋Δఔ౓ෳࡶͳܕγεςϜΛ΋ͭ ScalaͰͷ࠾༻࣮੷͕͋Δ ▸ ͪͳΈʹFengyun Liuࢯͷࢦಋڭһ͸Oderskyઌੜ

Slide 24

Slide 24 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ ͦ΋ͦ΋SpaceҎલͷ࣮૷ ▸ ݕࠪ͢Δର৅ͷܕ (Subject type) ͔Β֤έʔεΛ औΓআ͍ͯߦͬͯ࢒Γ͕ͳ͍͔ݟΔɺΈ͍ͨͳ࣮ ૷ ▸ ࣮͸SpaceΛ༻͍࣮ͨ૷ʹ͍ۙ͜ͱΛ͍ͯ͠Δ ͕ɺ͍͔ͭ͘໰୊͕͋ͬͨͨΊScala (Dotty)Ͱͷ ࣮੷ͷ͋ΔํࣜΛվΊͯ࠾༻

Slide 25

Slide 25 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ ݁Ռ

Slide 26

Slide 26 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ (ࢀߟ) SR-483

Slide 27

Slide 27 text

Space EngineΛ༻͍ͨ໢ཏੑνΣοΫ (ࢀߟ) SR-2293

Slide 28

Slide 28 text

SpaceΛ༻͍ͨ “໢ཏ”ͷఆࣜԽ

Slide 29

Slide 29 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ Space Engineͷ࣮૷ΛಡΉʹ͋ͨͬͯ ▸ SwiftͰͷ໢ཏੑνΣοΫͷ࣮૷Λཧղ͢ΔͨΊʹΞϧΰϦζϜΛ஌Δඞཁ͕͋Δ ▸ ΞϧΰϦζϜΛཧղ͢ΔͨΊʹ͸ Spaceʹؔ͢Δ༻ޠ΍ͦͷఆٛΛཧղ͓ͯ͘͠ ඞཁ͕͋Δ ▸ SpaceʹΑͬͯఆࣜԽ͞Εͨ “໢ཏ͍ͯ͠Δ” ͜ͱΛද͍ͯ͠ΔࣜΛཧղ͢Δͷ͕ ࠷ॳͷ໨ඪ (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . . ↑ ͜Ε͕໢ཏ͍ͯ͠Δ͜ͱΛදࣜ͢

Slide 30

Slide 30 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ ఆٛ (Space) ▸ ܕ΍ύλʔϯ͕औΓ͏Δ஋ͷू߹ΛSpaceͱ͍͏ ▸ Space͸࠶ؼతʹҎԼͷΑ͏ʹఆٛ͞ΕΔ 1. ΛۭSpace (empty space) 2. ΛܕTͷSpace (type space) 3. ͕Spaceͷͱ͖ɺ Λ union space 4. ͕SpaceͰɺK͕Constructor Typeͷͱ͖ (T) s1 , s2 , . . . s1 |s2 | . . . s1 , s2 , . . . , sn (K, s1 , s2 , . . . , sn ) Λconstructor space

Slide 31

Slide 31 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SwiftͰͷΠϝʔδ: (Bool) = {true, false} (Never) =

Slide 32

Slide 32 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SwiftͰͷΠϝʔδ: (Bool)|(Never) = {true, false}

Slide 33

Slide 33 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SwiftͰͷΠϝʔδ: (Optional . some, (Bool)) = {.some(true), . some(false)} Optional.someͷྫ Type constructor

Slide 34

Slide 34 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T) ·ͩఆ͍ٛͯ͠ͳ͍͕ɺ㲈 ू߹ͷแؚؔ܎

Slide 35

Slide 35 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T)

Slide 36

Slide 36 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T)

Slide 37

Slide 37 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T) (Bool?) = {.some(true), . some(false), . none}

Slide 38

Slide 38 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T) (Optional . none) = {.none}

Slide 39

Slide 39 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T) s1 |s2 |s3 s1 s2 s3

Slide 40

Slide 40 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ࢖ͬͯ”໢ཏੑνΣοΫ”Λݴ͍׵͑Δ ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T) (Bool?) ⪯ s1 |s2 |s3

Slide 41

Slide 41 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ ΑΓ௚؍తʹ͸ (Bool?) ⪯ s1 |s2 |s3 ֤case͕Χόʔ͍ͯ͠Δൣғͷ΄͏͕ େ͖͍ΑɺΈ͍ͨͳΠϝʔδ “େ͖͍” Λఆٛ͢Δํ๏ → Subspaceؔ܎

Slide 42

Slide 42 text

Subspaceؔ܎

Slide 43

Slide 43 text

Subspaceؔ܎ ఆٛ (Subspaceؔ܎) ▸ ΛSpace্ͷೋ߲ؔ܎ Subspaceؔ܎ ͱ͢Δ ⪯ s1 ⪯ s2 ▸ ௚؍తʹ͸ू߹ͷแؚؔ܎͕ͩɺཁૉʹ͸௚઀ݴٴͤͣʹ ܕ΍ܕߏஙࢠ (case) ͷؔ܎Λ࢖ͬͯఆ͍ٛͯ͘͠ɻৄࡉͳϧʔϧ͸ޙड़ɻ

Slide 44

Slide 44 text

Subspaceؔ܎ ఆٛ (projection) ▸ Λύλʔϯͱ͢Δɻ͜ͷͱ͖ ͕Χόʔ͢ΔSpaceΛ ͱද͢ ▸ ύλʔϯ = case ͱࢥͬͯࠩ͠ࢧ͑ͳ͍ (ਖ਼֬Ͱ͸ͳ͍) p (p) p ͬͪ͜͸type constructor ͬͪ͜͸pattern

Slide 45

Slide 45 text

Subspaceؔ܎ SwiftͰͷΠϝʔδ: (.some(true)) = {.some(true)} (.some(_)) = {.some(true), some(false)}

Slide 46

Slide 46 text

Subspaceؔ܎ ໢ཏͷఆࣜԽ (࠶ܝ) ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ (T)

Slide 47

Slide 47 text

Subspaceؔ܎ ໢ཏͷఆࣜԽ (࠶ܝ) ▸ Ϛονͤ͞Δର৅ͷܕTʹ͍ͭͯɺ ͕͢΂ͯͷcase͕Χόʔ͍ͯ͠Δspace ͷunion spaceͷsubspaceʹͳ͍ͬͯΔ͔ ▸ ύλʔϯ ͕ ܕ TΛ໢ཏ͍ͯ͠Δͱ͸ҎԼΛຬͨ͢͜ͱͰ͋Δɻ (T) p1 , p2 , . . . (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . . ͜͜·ͰͰ”໢ཏ”ͷ͕ࣜಡΊͨʂ(͸ͣʂ)

Slide 48

Slide 48 text

Subspaceؔ܎ SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ ▸ ໢ཏ͍ͯ͠Δ͜ͱΛSubspaceؔ܎Λ࢖ͬͯҎԼͷΑ͏ʹදͤͨ (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . . ▸ ࣍͸͜ͷSubspaceؔ܎ͷ۩ମతͳϧʔϧΛ·ͨผͷ֓೦Λ࢖ͬͯఆ͍ٛͯ͘͠…. (ΊΜͲ͍) s1 ⪯ s2 ⇔ s1 ⊖ s2 ≐ ΞϧΰϦζϜΛཧղ͢Δͷʹඞཁͳఆٛ͸ ͜ΕͰ࠷ޙͳͷͰ͕Μ͹Ζ͏…

Slide 49

Slide 49 text

⊖Λ࢖ͬͨSubspace ؔ܎ͷఆٛ

Slide 50

Slide 50 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ ⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ ▸ Subspaceؔ܎Λ௚઀తʹఆ͍ٛͯ͘͜͠ͱΛͤͣʹ৽ͨʹ㱿 (Subtraction) Λಋ ೖ͢Δ͜ͱͰSubspaceؔ܎Λఆٛ͢Δ ▸ ௚઀ఆٛ͠Α͏ͱ͕ͨ͠ɺ“We tried but failed.” Β͍͠ɻ ▸ ௚؍తʹ͸ू߹ͷsubtractionͱಉ͕ͩ͡ (ry

Slide 51

Slide 51 text

▸ Subspaceؔ܎ΛSubtractionΛ༻͍ͯఆٛ͢Δ ▸ Space ʹ͍ͭͯɺ ͕ ҎԼΛຬͨ࣌͢(͔ͭͦͷ࣌ͷΈ) ͕ ͷ SubspaceͰ͋Δͱ͍͏ ⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ ఆٛ (Subspaceؔ܎) s1 , s2 s1 s2 s1 s2 s1 ⪯ s2 ⇔ s1 ⊖ s2 ≐

Slide 52

Slide 52 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ Subtractionͷϧʔϧ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ΑΓҾ༻

Slide 53

Slide 53 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ Subtractionͷϧʔϧ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ΑΓҾ༻ empty spaceʹؔ͢Δϧʔϧ

Slide 54

Slide 54 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ Subtractionͷϧʔϧ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ΑΓҾ༻ subtypeʹؔ͢Δϧʔϧ

Slide 55

Slide 55 text

SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ SpaceΛ༻͍ͨ”໢ཏ”ͷఆࣜԽ (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . . (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐ “໢ཏ͍ͯ͠Δ” ͜͜·ͰΘ͔Ε͹ϝΠϯͷϩδοΫ͸ಡΊΔʂ

Slide 56

Slide 56 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 57

Slide 57 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 58

Slide 58 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 59

Slide 59 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 60

Slide 60 text

⊖Λ࢖ͬͨSubspaceؔ܎ͷఆٛ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 61

Slide 61 text

Decompose

Slide 62

Slide 62 text

Decompose Decompose ▸ enum E { case a, b } ͕͋ͬͨͱͯ͠ ͷܭࢉΛͲ͏ਐΊΔ ͔ʁ ▸ ͜ͷΑ͏ͳܭࢉΛਐΊΔͨΊʹܕEʹରͯ͠ Decompose (෼ղ) ͱ͍͏ૢ࡞Λఆ ٛ͢Δඞཁ͕͋Δ (E) ⊖ (a) ∣ (b)

Slide 63

Slide 63 text

Decompose Decompose ▸ ۩ମతʹͲ͏ఆٛ͞ΕΔ͔͸ͦͷϓϩάϥϛϯάݴޠʹΑΔ͕ɺSwiftʹ͓͍ͯ͸ enumΛ֤caseͷprojectionͷunion spaceʹ෼ղ͢Δ͜ͱ ▸ (E) = (a) ∣ (b) = (a) ∣ (b)

Slide 64

Slide 64 text

Decompose Decompose·ͰΘ͔Ε͹͍͍͍͚ͩͨΔ (E) ⊖ (a) ∣ (b) ≐ (E) ⪯ (a) ∣ (b) ໢ཏ͍ͯ͠Δͱ͸ subtractionΛ࢖ͬͯ

Slide 65

Slide 65 text

Decompose Decompose·ͰΘ͔Ε͹͍͍͍͚ͩͨΔ (E) ⊖ (a) ∣ (b) DecomposeΛ࢖ͬͯ (E) = (a) ∣ (b) (a) ∣ (b) ⊖ (a) ∣ (b) ͋ͱ͸Α͠ͳʹܭࢉΛਐΊΕ͹ (a) ∣ (b) ⊖ (a) ∣ (b) ≐

Slide 66

Slide 66 text

Swiftͷ࣮૷ΛಡΉ

Slide 67

Slide 67 text

Swiftͷ࣮૷ΛಡΉ Swiftͷ࣮૷ΛಡΉ ▸ ͓ർΕ༷Ͱͨ͠ɻ͜͜·ͰΘ͔Ε͹ίʔυΛಡΉͷ͸೉͘͠ͳ͍Ͱ͢ɻ ▸ ͜͜·Ͱղઆͨ͜͠ͱ͕΄΅ͦͷ··࣮૷͞Ε͍ͯΔ

Slide 68

Slide 68 text

Swiftͷ࣮૷ΛಡΉ Swiftʹ͓͚ΔSpace Bool͸ಛผѻ͍ɻ ↓͜ΜͳΠϝʔδ

Slide 69

Slide 69 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫͷΤϯτϦϙΠϯτ

Slide 70

Slide 70 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫͷΤϯτϦϙΠϯτ ͢΂ͯͷCase(Pattern)ʹ͍ͭͯ

Slide 71

Slide 71 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫͷΤϯτϦϙΠϯτ ProjectionΛٻΊͯ

Slide 72

Slide 72 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫͷΤϯτϦϙΠϯτ spacesʹ٧ΊΔ

Slide 73

Slide 73 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫͷΤϯτϦϙΠϯτ (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . .

Slide 74

Slide 74 text

Swiftͷ࣮૷ΛಡΉ ໢ཏੑνΣοΫ (T) ⊖ (p1 ) ∣ (p2 ) ∣ . . . ≐

Slide 75

Slide 75 text

▸ ͜͜·ͰͷղઆͲ͓ΓͳΒ ʹΑͬͯఆٛ͞Ε͍ͯΔ͸͕ͣͩɺEmpty sapce ޲͚ʹOptimze͞Ε͍ͯΔͨΊʹཧ࿦௨ΓͰ͸ͳ͍ Swiftͷ࣮૷ΛಡΉ Subspaceͷఆٛ ⊖

Slide 76

Slide 76 text

Swiftͷ࣮૷ΛಡΉ Subspaceͷఆٛ

Slide 77

Slide 77 text

Swiftͷ࣮૷ΛಡΉ Subtractionͷఆٛ

Slide 78

Slide 78 text

Swiftͷ࣮૷ΛಡΉ Subtractionͷఆٛ

Slide 79

Slide 79 text

৑௕ੑνΣοΫ

Slide 80

Slide 80 text

৑௕ੑνΣοΫ ৑௕ੑ(Redundancy)νΣοΫ ▸ ৑௕ͳέʔεͷνΣοΫ΋Spaceͷ࢓૊Έʹ৐͔͍ͬͬͯΔ ▸ ݩͷPaperʹ͸ॻ͔Ε͍ͯͳ͍͕ɺΞϧΰϦζϜ͸ίʔυ͔ΒಡΈऔΕΔ

Slide 81

Slide 81 text

৑௕ੑνΣοΫ ৑௕ੑνΣοΫͷΞϧΰϦζϜ ▸ ໢ཏੑνΣοΫͷաఔͰ֤έʔεͷunion spaceΛܭࢉ͍ͯ͘͠ (T) ⪯ (p1 ) ∣ (p2 ) ∣ . . . ͜ͷ෦෼ ▸ ܭࢉͷաఔͰɺ৽ͨʹ௥Ճ͢Δέʔε͕ͦ͜·Ͱͷunion spaceͷsubspaceʹ ͳ͍ͬͯͳ͍͔ΛνΣοΫ͢Δ (p1 ) ∣ (p2 )| . . . |(pn ) ⪯ (pn + 1)

Slide 82

Slide 82 text

৑௕ੑνΣοΫ ৑௕ੑνΣοΫͷΞϧΰϦζϜ

Slide 83

Slide 83 text

৑௕ੑνΣοΫ ৑௕ੑνΣοΫͷΞϧΰϦζϜ (a) ∣ (b) ⪯ (c) (a) ∣ (b) ∣ (c) ⪯ (a) (a) ⪯ (b) ੒ཱ͠ͳ͍ͷͰOK ੒ཱ͢ΔͷͰ৑௕

Slide 84

Slide 84 text

৑௕ੑνΣοΫ ࣮૷

Slide 85

Slide 85 text

where۟

Slide 86

Slide 86 text

Where۟ Where۟ ▸ ܕ΍ܕߏஙࢠಉ࢜ͷؔ܎ʹج͍ͮͯSubspace(Subtraction)͕ఆٛ͞ΕΔ ▸ ஋ʹ௚઀ݴٴ͢ΔΑ͏ͳ΋ͷ͸͜ͷΞϧΰϦζϜͰ͸ѻ͑ͳ͍ ▸ 3.4 Limitations ʹ “Guards in pattern clauses pose a theoretical difficulty, thus are not handled by the algorithm.” ͱॻ͔Ε͍ͯΔ௨Γ

Slide 87

Slide 87 text

Where۟ Where۟

Slide 88

Slide 88 text

Int

Slide 89

Slide 89 text

Int IntͷΑ͏ʹҰҙʹDecompose͕ఆٛͰ͖ͳ͍ܕͷ৔߹ ▸ Intͷ৔߹Decompose͕ҰҙʹఆٛͰ͖ͳ͍ → ѻ͑ͳ͍ ▸ ٯʹBool͸Ұҙʹ෼ղ͕ఆٛͰ͖Δ͕Ώ͑ʹಛผѻ͍Ͱ͖Δ

Slide 90

Slide 90 text

·ͱΊ

Slide 91

Slide 91 text

switchͷ໢ཏੑ/৑௕ੑνΣοΫ ·ͱΊ ▸ swiftc͕͍͔ʹͯ͠switchͷ໢ཏੑνΣοΫΛ͍ͯ͠Δ͔Λɺഎܠʹ͋ΔSpaceͱ ͍͏֓೦Λݩʹͨ͠ύλʔϯϚονͷ໢ཏੑνΣοΫͷཧ࿦ͱͦͷ࣮૷ʹ͍ͭ ͯɺlib/Sema/TypeCheckSwitchStmt.cppͱιʔείʔυதͰ঺հ͞Ε͍ͯΔ࿦ จΛݩʹ঺հͨ͠ɻ

Slide 92

Slide 92 text

Appendix: Intersection

Slide 93

Slide 93 text

Intersection Intersectionͷఆٛ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ΑΓҾ༻

Slide 94

Slide 94 text

Intersection Intersectionͷఆٛ A generic algorithm for checking exhaustivity of pattern matching, F. Liu, Scala 16’, 2017 ΑΓҾ༻