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

Opaque Result Type with type system

Opaque Result Type with type system

C114c127f13522da92cb03e5d14946ca?s=128

Takuma Shimizu

April 19, 2019
Tweet

Transcript

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

  2. w ਗ਼ਫ୓ຏ w!IPLVSPO wυϝΠϯۦಈઃܭ w J04 w 3VCZPO3BJMT w 3VTU

    wϑΣϯϦϧגࣜձࣾ
  3. Opaque Result Type Λͻ΋ͱ͘

  4. IUUQTRJJUBDPNLPIFSJUFNTEGEDFG

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

  7. Opaque Argument Type w Ҿ਺ͷ৔ॴʹҐஔ͢Δsome Protocol w ௨ৗͷHFOFSJDTͱಉ͡ৼΔ෣͍ w TQFDJBMJ[BUJPO

    w ݺͼग़͠ଆ͕۩ମతͳܕΛܾఆ
  8. Opaque Argument Type // generics func useAnimal<A: Animal>(_ animal: A)

    { animal.foo() } // Opaque Argument Type func useAnimal(_ animal: some Animal) { animal.foo() } 㲈 ಉ౳ ˡͳΜͰʁ
  9. ྔԽ 2VBOUJpDBUJPO

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

    (func(A: Animal) -> ()) 䁭 શশྔԽܕ func(∃ A. A: Animal) -> () 䁭 ଘࡏྔԽܕ func useAnimal(_ animal: some Animal) { animal.foo() }
  11. (∀ x. (P(x) → Q)) 䁭 શশྔԽܕ ((∃ x. P(x))

    → Q) 䁭 ଘࡏྔԽܕ ∀ A. (func(A: Animal) -> ()) func(∃ A. A: Animal) -> ()
  12. (∀ x. (P(x) → Q)) ((∃ x. P(x)) → Q)

    㱻 㱻 ͜ͷه߸͸ʮಉ஋ʯͷҙຯͰ͢
  13. Opaque Argument Type w HFOFSJDT શশྔԽ ͱΑ͘ࣅͨߏ଄Λ࣋ͭ w Ϣχόʔαϧ ීวɾશশ

    ʹ͸ͳΒͳ͍ w useAnimal<T>(a: T)ͱಉ͜͡ͱ͕Ͱ͖ͳ͍ w useAnimal(a: some T)ͱ͸ॻ͚ͳ͍ w ಛఆͷ࣮ࡏ ଘࡏ ͢ΔܕΛඞͣ࣋ͭ ଘࡏྔԽ
  14. Opaque Result Type Λͻ΋ͱ͘

  15. func(∃ A. A: Animal) -> () 䁭 ଘࡏྔԽܕ func useAnimal(_

    animal: some Animal) Opaque Argument Type func useAnimal<A: Animal>(_ animal: A) ∀ A. (func(A: Animal) -> ()) 䁭 શশྔԽܕ
  16. func(∃ A. A: Animal) -> () 䁭 ଘࡏྔԽܕ func useAnimal(_

    animal: some Animal) Opaque Argument Type func useAnimal<A: Animal>(_ animal: A) ∀ A. (func(A: Animal) -> ()) 䁭 શশྔԽܕ
  17. func() -> (∃ A. A: Animal) 䁭 ଘࡏྔԽܕ func makeAnimal()

    -> some Animal Opaque Result Type func makeAnimal<A: Animal>(_: A) -> A ∀ A. (func(A: Animal) -> A) 䁭 શশྔԽܕ
  18. func() -> (∃ A. A: Animal) 䁭 ଘࡏྔԽܕ func makeAnimal()

    -> some Animal Opaque Result Type func makeAnimal<A: Animal>(_: A) -> A ∀ A. (func(A: Animal) -> A) 䁭 શশྔԽܕ
  19. ଘࡏྔԽܕ w ه߸ʹྡ઀͢ΔQSPUPDPM΁ͷ ܕ ੍໿ͷΈ͕είʔϓ w func(∃ A. A: Animal)

    -> () w func() -> (∃ A. A: Animal) w ྔԽܕߏจͷ؍఺Ͱ͸ہॴత
  20. Opaque Result Type w ฦ٫஋ͷ৔ॴʹҐஔ͢Δsome Protocol w 3FWFSTFHFOFSJDT w TQFDJBMJ[BUJPO

    w ݺͼग़͞ΕΔଆ ࣮૷ଆ ͕۩ମతͳܕΛܾఆ w SFUVSO͢ΔΦϒδΣΫτͷܕ͸ಈతʹม͑ΒΕͳ͍
  21. func makeAnimal() -> some Animal { return flag ? Dog()

    : Cat() } ͜͏ॻ͘͜ͱ͸Ͱ͖ͳ͍ ະ֬ೝͰ͕͢QSPQPTBMΛݟΔݶΓແཧͳ͸ͣʜ "OJNBMʹ४ڌ͍ͯͯ͠΋ ฦ٫Ͱ͖ΔΠϯελϯεͷܕ͸ͻͱ͚ͭͩ
  22. w HFOFSJDT w ίϯύΠϥ͸Ͳͷܕ͕ฦ͞ΕΔͷ͔஌͓ͬͯ͘ඞཁ͕͋Δ w ଘࡏ ྔԽ ܕ͸࣮ߦ࣌Ͱ͸ଘࡏ͠ͳ͍ w ४ڌͨ͠۩৅ܕʹஔ͖׵͑ΒΕΔ

    Reverse generics
  23. ଘࡏྔԽ w ྔԽܕͷදݱͱ͸ରরతʹɺଘࡏྔԽ͕
 ؔ਺ ϝιου શମΛείʔϓʹऔ͍ͬͯΔ w ࣮ࡍɿfunc() -> (∃

    A. A: Animal) w ײ֮ɿ∃ A. (func() -> (A: Animal)) w any Protocol΍Opaque Argument Type͸
 ଘࡏྔԽܕΛͦͷ··දݱͯͦ͠͏ &YJTUFOUJBM$POUBJOFSΛ ߟྀ͠ͳ͚Ε͹ʜ
  24. Opaque Result Type w some Protocol͸୯Ұͷ۩৅ ඇྔԽ ܕͷΈ࢖͑Δ w ࣮ߦ࣌ʹଘࡏ͠ͳ͍ଘࡏܕ

    w ྔԽදݱͱ࣮ࡍͷৼΔ෣͍͕Ұக͠ͳ͍ w 0QBRVF"SHVNFOU5ZQFͱҟͳΔηϚϯςΟοΫΛ࣋ͭ w ίʔυॻ͍ͯΔͱ͖ʹˢͦΜͳ͜ͱؾʹ͠ͳ͍
  25. Opaque Result Type Λ׆༻͠·͠ΐ͏ʂ

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