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

Opaque Result Type in Swift with Rust

Opaque Result Type in Swift with Rust

Takuma Shimizu

March 27, 2019

Transcript

10 slides
  1. リバースジェネリクス 通常のジェネリクス func useAnimal<A: Animal>(_ animal: A) { animal.foo() }

    メソッド名に型引数を宣言 引数で型変数を利用 呼び出し側が型引数に対応する具象型を決定
  2. リバースジェネリクス リバースジェネリクス func makeAnimal() -> <A: Animal> A { return

    Cat() } メソッドシグネチャの後に型引数を宣言 返却値の型が型変数 実装側が型引数に対応する具象型を決定
  3. ジェネリクス func useAnimal<A: Animal>(_ animal: A) ↓ 型システム的な表現にすると ∀ A.

    (func(A: Animal) -> ()) Opaque type func useAnimal(_ animal: some Animal) ↓ 型システム的な表現にすると (∃ A. A: Animal) -> ()
  4. ∀ A. (func(A: Animal) -> ()) ターンエーガンダムみたいななんかよく分からん記号 が、メソッドの引数から返却値まで全体にかかってい る。 (∃

    A. A: Animal) -> () カタカナの「ヨ」みたいななんかよく分からん記号 は、出現場所( メソッド引数) だけにかかっている。 A. A: Animal の部分は一致している
  5. つまり ∀ A. (func(A: Animal) -> ()) ⇔ (∃ A.

    A: Animal) -> () という関係が成り立つ。 メソッド引数として利用した場合、通常のジェネリク スと同義 → 同じではないが、同形をとる

More Decks by Takuma Shimizu

Other Decks in Programming