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
Tweet

More Decks by Takuma Shimizu

Other Decks in Programming

Transcript

  1. Opaque Result Type in Swift
    with Rust

    View Slide

  2. 『Swift 5.1
    に導入されそうな Opaque Result Type

    は何か』
    https://qiita.com/koher/items/338d2f2d0c4731e35
    08f

    View Slide

  3. リバースジェネリクス
    通常のジェネリクス
    func useAnimal(_ animal: A) {
    animal.foo()
    }
    メソッド名に型引数を宣言
    引数で型変数を利用
    呼び出し側が型引数に対応する具象型を決定

    View Slide

  4. リバースジェネリクス
    リバースジェネリクス
    func makeAnimal() -> A {
    return Cat()
    }
    メソッドシグネチャの後に型引数を宣言
    返却値の型が型変数
    実装側が型引数に対応する具象型を決定

    View Slide

  5. Opaque Result Type
    some Animal

    返却値の型として利用

    リバースジェネリクス
    メソッド引数として利用

    通常のジェネリクスと同義
    !!????

    View Slide

  6. ジェネリクス
    func useAnimal(_ animal: A)

    型システム的な表現にすると
    ∀ A. (func(A: Animal) -> ())
    Opaque type
    func useAnimal(_ animal: some Animal)

    型システム的な表現にすると
    (∃ A. A: Animal) -> ()

    View Slide

  7. ∀ A. (func(A: Animal) -> ())
    ターンエーガンダムみたいななんかよく分からん記号
    が、メソッドの引数から返却値まで全体にかかってい
    る。
    (∃ A. A: Animal) -> ()
    カタカナの「ヨ」みたいななんかよく分からん記号
    は、出現場所(
    メソッド引数)
    だけにかかっている。
    A. A: Animal
    の部分は一致している

    View Slide

  8. つまり
    ∀ A. (func(A: Animal) -> ())
    ⇔ (∃ A. A: Animal) -> ()
    という関係が成り立つ。
    メソッド引数として利用した場合、通常のジェネリク
    スと同義

    同じではないが、同形をとる

    View Slide

  9. なぜプロトコル型に
    パフォーマンス上のロスがあるのか

    View Slide

  10. Demo with Rust

    View Slide