Opaque Result Type with type system

Opaque Result Type with type system

C114c127f13522da92cb03e5d14946ca?s=128

Takuma Shimizu

April 19, 2019
Tweet

Transcript

  1. 5.
  2. 8.

    Opaque Argument Type // generics func useAnimal<A: Animal>(_ animal: A)

    { animal.foo() } // Opaque Argument Type func useAnimal(_ animal: some Animal) { animal.foo() } 㲈 ಉ౳ ˡͳΜͰʁ
  3. 10.

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

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

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

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

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

    㱻 㱻 ͜ͷه߸͸ʮಉ஋ʯͷҙຯͰ͢
  6. 13.

    Opaque Argument Type w HFOFSJDT શশྔԽ ͱΑ͘ࣅͨߏ଄Λ࣋ͭ w Ϣχόʔαϧ ීวɾશশ

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

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

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

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

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

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

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

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

    -> some Animal Opaque Result Type func makeAnimal<A: Animal>(_: A) -> A ∀ A. (func(A: Animal) -> A) 䁭 શশྔԽܕ
  11. 19.

    ଘࡏྔԽܕ w ه߸ʹྡ઀͢ΔQSPUPDPM΁ͷ ܕ ੍໿ͷΈ͕είʔϓ w func(∃ A. A: Animal)

    -> () w func() -> (∃ A. A: Animal) w ྔԽܕߏจͷ؍఺Ͱ͸ہॴత
  12. 20.

    Opaque Result Type w ฦ٫஋ͷ৔ॴʹҐஔ͢Δsome Protocol w 3FWFSTFHFOFSJDT w TQFDJBMJ[BUJPO

    w ݺͼग़͞ΕΔଆ ࣮૷ଆ ͕۩ମతͳܕΛܾఆ w SFUVSO͢ΔΦϒδΣΫτͷܕ͸ಈతʹม͑ΒΕͳ͍
  13. 21.

    func makeAnimal() -> some Animal { return flag ? Dog()

    : Cat() } ͜͏ॻ͘͜ͱ͸Ͱ͖ͳ͍ ະ֬ೝͰ͕͢QSPQPTBMΛݟΔݶΓແཧͳ͸ͣʜ "OJNBMʹ४ڌ͍ͯͯ͠΋ ฦ٫Ͱ͖ΔΠϯελϯεͷܕ͸ͻͱ͚ͭͩ
  14. 23.

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

    A. A: Animal) w ײ֮ɿ∃ A. (func() -> (A: Animal)) w any Protocol΍Opaque Argument Type͸
 ଘࡏྔԽܕΛͦͷ··දݱͯͦ͠͏ &YJTUFOUJBM$POUBJOFSΛ ߟྀ͠ͳ͚Ε͹ʜ
  15. 24.

    Opaque Result Type w some Protocol͸୯Ұͷ۩৅ ඇྔԽ ܕͷΈ࢖͑Δ w ࣮ߦ࣌ʹଘࡏ͠ͳ͍ଘࡏܕ

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