Opaque Result Type in Swiftwith Rust
View Slide
『Swift 5.1に導入されそうな Opaque Result Typeとは何か』https://qiita.com/koher/items/338d2f2d0c4731e3508f
リバースジェネリクス通常のジェネリクスfunc useAnimal(_ animal: A) {animal.foo()}メソッド名に型引数を宣言引数で型変数を利用呼び出し側が型引数に対応する具象型を決定
リバースジェネリクスリバースジェネリクスfunc makeAnimal() -> A {return Cat()}メソッドシグネチャの後に型引数を宣言返却値の型が型変数実装側が型引数に対応する具象型を決定
Opaque Result Typesome Animalを返却値の型として利用→リバースジェネリクスメソッド引数として利用→通常のジェネリクスと同義!!????
ジェネリクスfunc useAnimal(_ animal: A)↓型システム的な表現にすると∀ A. (func(A: Animal) -> ())Opaque typefunc useAnimal(_ animal: some Animal)↓型システム的な表現にすると(∃ A. A: Animal) -> ()
∀ A. (func(A: Animal) -> ())ターンエーガンダムみたいななんかよく分からん記号が、メソッドの引数から返却値まで全体にかかっている。(∃ A. A: Animal) -> ()カタカナの「ヨ」みたいななんかよく分からん記号は、出現場所(メソッド引数)だけにかかっている。A. A: Animalの部分は一致している
つまり∀ A. (func(A: Animal) -> ())⇔ (∃ A. A: Animal) -> ()という関係が成り立つ。メソッド引数として利用した場合、通常のジェネリクスと同義→同じではないが、同形をとる
なぜプロトコル型にパフォーマンス上のロスがあるのか
Demo with Rust