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

Opaque Result Type with type system

Opaque Result Type with type system

Takuma Shimizu

April 19, 2019
Tweet

More Decks by Takuma Shimizu

Other Decks in Programming

Transcript

  1. .PCJMF"DU,:050
    Opaque Result Type
    Λͻ΋ͱ͘

    View Slide

  2. w ਗ਼ਫ୓ຏ
    w!IPLVSPO
    wυϝΠϯۦಈઃܭ
    w J04
    w 3VCZPO3BJMT
    w 3VTU
    wϑΣϯϦϧגࣜձࣾ

    View Slide

  3. Opaque Result Type
    Λͻ΋ͱ͘

    View Slide

  4. IUUQTRJJUBDPNLPIFSJUFNTEGEDFG

    View Slide

  5. View Slide

  6. ෮श
    .PCJMF"DU04","ΑΓ

    View Slide

  7. Opaque Argument Type
    w Ҿ਺ͷ৔ॴʹҐஔ͢Δsome Protocol
    w ௨ৗͷHFOFSJDTͱಉ͡ৼΔ෣͍
    w TQFDJBMJ[BUJPO
    w ݺͼग़͠ଆ͕۩ମతͳܕΛܾఆ

    View Slide

  8. Opaque Argument Type
    // generics
    func useAnimal(_ animal: A) {
    animal.foo()
    }
    // Opaque Argument Type
    func useAnimal(_ animal: some Animal) {
    animal.foo()
    }

    ಉ౳ ˡͳΜͰʁ

    View Slide

  9. ྔԽ
    2VBOUJpDBUJPO

    View Slide

  10. func useAnimal(_ animal: A) {
    animal.foo()
    }
    ∀ A. (func(A: Animal) -> ())

    શশྔԽܕ
    func(∃ A. A: Animal) -> ()

    ଘࡏྔԽܕ
    func useAnimal(_ animal: some Animal) {
    animal.foo()
    }

    View Slide

  11. (∀ x. (P(x) → Q))

    શশྔԽܕ
    ((∃ x. P(x)) → Q)

    ଘࡏྔԽܕ
    ∀ A. (func(A: Animal) -> ())
    func(∃ A. A: Animal) -> ()

    View Slide

  12. (∀ x. (P(x) → Q)) ((∃ x. P(x)) → Q)


    ͜ͷه߸͸ʮಉ஋ʯͷҙຯͰ͢

    View Slide

  13. Opaque Argument Type
    w HFOFSJDT શশྔԽ
    ͱΑ͘ࣅͨߏ଄Λ࣋ͭ
    w Ϣχόʔαϧ ීวɾશশ
    ʹ͸ͳΒͳ͍
    w useAnimal(a: T)ͱಉ͜͡ͱ͕Ͱ͖ͳ͍
    w useAnimal(a: some T)ͱ͸ॻ͚ͳ͍
    w ಛఆͷ࣮ࡏ ଘࡏ
    ͢ΔܕΛඞͣ࣋ͭ ଘࡏྔԽ

    View Slide

  14. Opaque Result Type
    Λͻ΋ͱ͘

    View Slide

  15. func(∃ A. A: Animal) -> ()

    ଘࡏྔԽܕ
    func useAnimal(_ animal: some Animal)
    Opaque Argument Type
    func useAnimal(_ animal: A)
    ∀ A. (func(A: Animal) -> ())

    શশྔԽܕ

    View Slide

  16. func(∃ A. A: Animal) -> ()

    ଘࡏྔԽܕ
    func useAnimal(_ animal: some Animal)
    Opaque Argument Type
    func useAnimal(_ animal: A)
    ∀ A. (func(A: Animal) -> ())

    શশྔԽܕ

    View Slide

  17. func() -> (∃ A. A: Animal)

    ଘࡏྔԽܕ
    func makeAnimal() -> some Animal
    Opaque Result Type
    func makeAnimal(_: A) -> A
    ∀ A. (func(A: Animal) -> A)

    શশྔԽܕ

    View Slide

  18. func() -> (∃ A. A: Animal)

    ଘࡏྔԽܕ
    func makeAnimal() -> some Animal
    Opaque Result Type
    func makeAnimal(_: A) -> A
    ∀ A. (func(A: Animal) -> A)

    શশྔԽܕ

    View Slide

  19. ଘࡏྔԽܕ
    w ه߸ʹྡ઀͢ΔQSPUPDPM΁ͷ ܕ
    ੍໿ͷΈ͕είʔϓ
    w func(∃ A. A: Animal) -> ()
    w func() -> (∃ A. A: Animal)
    w ྔԽܕߏจͷ؍఺Ͱ͸ہॴత

    View Slide

  20. Opaque Result Type
    w ฦ٫஋ͷ৔ॴʹҐஔ͢Δsome Protocol
    w 3FWFSTFHFOFSJDT
    w TQFDJBMJ[BUJPO
    w ݺͼग़͞ΕΔଆ ࣮૷ଆ
    ͕۩ମతͳܕΛܾఆ
    w SFUVSO͢ΔΦϒδΣΫτͷܕ͸ಈతʹม͑ΒΕͳ͍

    View Slide

  21. func makeAnimal() -> some Animal {
    return flag ? Dog() : Cat()
    }
    ͜͏ॻ͘͜ͱ͸Ͱ͖ͳ͍
    ະ֬ೝͰ͕͢QSPQPTBMΛݟΔݶΓແཧͳ͸ͣʜ

    "OJNBMʹ४ڌ͍ͯͯ͠΋
    ฦ٫Ͱ͖ΔΠϯελϯεͷܕ͸ͻͱ͚ͭͩ

    View Slide

  22. w HFOFSJDT
    w ίϯύΠϥ͸Ͳͷܕ͕ฦ͞ΕΔͷ͔஌͓ͬͯ͘ඞཁ͕͋Δ
    w ଘࡏ ྔԽ
    ܕ͸࣮ߦ࣌Ͱ͸ଘࡏ͠ͳ͍
    w ४ڌͨ͠۩৅ܕʹஔ͖׵͑ΒΕΔ
    Reverse generics

    View Slide

  23. ଘࡏྔԽ
    w ྔԽܕͷදݱͱ͸ରরతʹɺଘࡏྔԽ͕

    ؔ਺ ϝιου
    શମΛείʔϓʹऔ͍ͬͯΔ
    w ࣮ࡍɿfunc() -> (∃ A. A: Animal)
    w ײ֮ɿ∃ A. (func() -> (A: Animal))
    w any Protocol΍Opaque Argument Type͸

    ଘࡏྔԽܕΛͦͷ··දݱͯͦ͠͏
    &YJTUFOUJBM$POUBJOFSΛ
    ߟྀ͠ͳ͚Ε͹ʜ

    View Slide

  24. Opaque Result Type
    w some Protocol͸୯Ұͷ۩৅ ඇྔԽ
    ܕͷΈ࢖͑Δ
    w ࣮ߦ࣌ʹଘࡏ͠ͳ͍ଘࡏܕ
    w ྔԽදݱͱ࣮ࡍͷৼΔ෣͍͕Ұக͠ͳ͍
    w 0QBRVF"SHVNFOU5ZQFͱҟͳΔηϚϯςΟοΫΛ࣋ͭ
    w ίʔυॻ͍ͯΔͱ͖ʹˢͦΜͳ͜ͱؾʹ͠ͳ͍

    View Slide

  25. Opaque Result Type
    Λ׆༻͠·͠ΐ͏ʂ

    View Slide

  26. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide