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

C114c127f13522da92cb03e5d14946ca?s=128

Takuma Shimizu

March 27, 2019
Tweet

Transcript

  1. Opaque Result Type in Swift with Rust

  2. 『Swift 5.1 に導入されそうな Opaque Result Type と は何か』 https://qiita.com/koher/items/338d2f2d0c4731e35 08f

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

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

    Cat() } メソッドシグネチャの後に型引数を宣言 返却値の型が型変数 実装側が型引数に対応する具象型を決定
  5. Opaque Result Type some Animal を 返却値の型として利用 → リバースジェネリクス メソッド引数として利用

    → 通常のジェネリクスと同義 !!????
  6. ジェネリクス func useAnimal<A: Animal>(_ animal: A) ↓ 型システム的な表現にすると ∀ A.

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

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

    A: Animal) -> () という関係が成り立つ。 メソッド引数として利用した場合、通常のジェネリク スと同義 → 同じではないが、同形をとる
  9. なぜプロトコル型に パフォーマンス上のロスがあるのか

  10. Demo with Rust