実存的な型情報を保持するためにパターンマッチングが必要なのはなぜですか?

型クラスを使用してF有界量化を回避する方法を説明するブログ(Scalaでの「現在の」型の戻りを参照)は、その終わり近くに言及しています。

ここでの問題は、の種類との間の接続点であるp._1とはp._2、コンパイラは、もはや彼らは正確に並ぶことを知っているので、この文脈で失われることはありません。これを修正する方法、および一般に存在の喪失を防ぐ方法は、パターンマッチを使用することです。

上記のコードが機能しないことを確認しました。

pets.map(p => esquire(p._1)(p._2))

他のパターンマッチングバリアントは次のことを行います。

pets.map { case (a, pa)  => esquire(a)(pa) }

言及されていない別のバリアントもあり、これも機能します。

pets.map{case p => esquire(p._1)(p._2)}

ここの魔法は何ですか?存在する型情報case p =>p =>保持する代わりに使用するのはなぜですか?

私はこれをScala2.12と2.13でテストしました。

コードで遊ぶためのScastieリンク:https://scastie.scala-lang.org/480It2tTS2yNxCi1JmHx8w

Scala 3(Dotty)では、実存型が存在しなくなったため(しゃれを意図したもの)、質問を変更する必要があります。case別のscastieで示されているように、そこがなくて機能するようです:https://scastie.scala-lang.org/qDfIgkooQe6VTYOssZLYBg case pScala 2.12 /2.13のヘルパークラスでもまだ必要かどうかを確認できます-それなしのコンパイルエラー)。

ヘルパーで変更されたコードcase class

case class PetStored[A](a: A)(implicit val pet: Pet[A])

val pets = List(PetStored(bob), PetStored(thor))

println(pets.map{case p => esquire(p.a)(p.pet)})
マリオガリック

https://stackoverflow.com/a/49712407/5205022基づいて、スニペットを検討してください

pets.map { p =>
  val x = p._1
  val y = p._2
  esquire(x)(y)
}

型チェックは、後に-Xprint:typerなると

Hello.this.pets.map[Any](((p: (A, example.Hello.Pet[A]) forSome { type A }) => {
  val x: Any = p._1;
  val y: example.Hello.Pet[_] = p._2;
  Hello.this.esquire[Any](x)(<y: error>)
}))

パターンマッチングのあるスニペット

pets.map { case (a, pa) =>
  val x = a
  val y = pa
  esquire(x)(y)
}

タイプチェック後

 Hello.this.pets.map[Any](((x0$1: (A, example.Hello.Pet[A]) forSome { type A }) => x0$1 match {
  case (_1: A, _2: example.Hello.Pet[A]): (A, example.Hello.Pet[A])((a @ _), (pa @ _)) => {
    val x: A = a;
    val y: example.Hello.Pet[A] = pa;
    Hello.this.esquire[A](x)(y)
  }
}));

後者のパターンマッチングの場合、実存型パラメーターAが再導入されることに注意してください。

val x: A = a;
val y: example.Hello.Pet[A] = pa;

そして、の間の関係にxし、y失われた関係と一致するパターンがない場合にしながら、再確立され

val x: Any = p._1;
val y: example.Hello.Pet[_] = p._2;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

先物をパターンマッチングするためにandThenを使用する必要があるのはなぜですか?

分類Dev

命令型言語にパターンマッチングがないのはなぜですか?

分類Dev

特定のゴルーチンを実行するためにtime.sleepが必要なのはなぜですか?

分類Dev

チェーンがパーツに分割されると、ExpressionInterceptUrlRegistry呼び出しのチェーンが型情報を失うのはなぜですか?

分類Dev

位置情報サービスを改善するためにwifiが必要なのはなぜですか?

分類Dev

型パラメーターを制約するために特性が必要なのはなぜですか?

分類Dev

ジェネリック型定義で実装されたインターフェースが型情報を失うのはなぜですか?

分類Dev

インスタンスストアEC2からAMIを作成する場合、なぜ-e excludeを使用する必要があるのですか?資格情報を保持するために--nofilterを使用するべきではありませんか?

分類Dev

単一のフィールドに関する情報を取得するために、複数のタイプのバインディングフラグを指定する必要があるのはなぜですか?

分類Dev

パブリックGitリポジトリのクローンを作成するためにマシンのsshキーが必要なのはなぜですか?

分類Dev

この関数に追加の型情報を含める必要があるのはなぜですか

分類Dev

PartialEqとEqを実装しているのに、パターンマッチング時に定数を使用できないのはなぜですか?

分類Dev

パターンマッチングの代わりにラムダを使用するのはなぜですか?

分類Dev

エンコーディングを指定するメタデータ情報が必要なのはなぜですか?

分類Dev

型族でパターンマッチングできないのはなぜですか?

分類Dev

これを実行するためにifステートメントが必要なのはなぜですか

分類Dev

コードをコンパイルするためにclangでlibgcc.aが必要なのはなぜですか?

分類Dev

この単純なSpring構成を実行するために引数なしのコンストラクターが必要なのはなぜですか?

分類Dev

typescriptを使用するためにタイピングが必要なのはなぜですか?

分類Dev

Scalaパターンマッチングが `s" $ var "`をサポートしないのはなぜですか?

分類Dev

「カスタマイズされたEnumコンストラクター」が他のすべてのEnum型の情報を返すのはなぜですか?

分類Dev

Haskellが内包表記のパターンマッチングを許可しないのはなぜですか?

分類Dev

Foreach-Objectコマンドレットを実行するためにEnterキーを2回押す必要があるのはなぜですか?

分類Dev

ユニオンでのパターンマッチングに到達不能なパターン警告があるのはなぜですか?

分類Dev

gen_serverがパターンマッチングを考慮しないのはなぜですか?

分類Dev

パターンマッチングの代わりにヘッド/テールを使用すると、評価が終了するのはなぜですか?

分類Dev

最高のパフォーマンスを得るために、バッファを64バイト境界に揃える必要があるのはなぜですか?

分類Dev

Javaでシングルトンパターンを設計するときに、なぜダブルチェックロックが必要なのですか?

分類Dev

パターンマッチングがPythonでこの結果を返すのはなぜですか?

Related 関連記事

  1. 1

    先物をパターンマッチングするためにandThenを使用する必要があるのはなぜですか?

  2. 2

    命令型言語にパターンマッチングがないのはなぜですか?

  3. 3

    特定のゴルーチンを実行するためにtime.sleepが必要なのはなぜですか?

  4. 4

    チェーンがパーツに分割されると、ExpressionInterceptUrlRegistry呼び出しのチェーンが型情報を失うのはなぜですか?

  5. 5

    位置情報サービスを改善するためにwifiが必要なのはなぜですか?

  6. 6

    型パラメーターを制約するために特性が必要なのはなぜですか?

  7. 7

    ジェネリック型定義で実装されたインターフェースが型情報を失うのはなぜですか?

  8. 8

    インスタンスストアEC2からAMIを作成する場合、なぜ-e excludeを使用する必要があるのですか?資格情報を保持するために--nofilterを使用するべきではありませんか?

  9. 9

    単一のフィールドに関する情報を取得するために、複数のタイプのバインディングフラグを指定する必要があるのはなぜですか?

  10. 10

    パブリックGitリポジトリのクローンを作成するためにマシンのsshキーが必要なのはなぜですか?

  11. 11

    この関数に追加の型情報を含める必要があるのはなぜですか

  12. 12

    PartialEqとEqを実装しているのに、パターンマッチング時に定数を使用できないのはなぜですか?

  13. 13

    パターンマッチングの代わりにラムダを使用するのはなぜですか?

  14. 14

    エンコーディングを指定するメタデータ情報が必要なのはなぜですか?

  15. 15

    型族でパターンマッチングできないのはなぜですか?

  16. 16

    これを実行するためにifステートメントが必要なのはなぜですか

  17. 17

    コードをコンパイルするためにclangでlibgcc.aが必要なのはなぜですか?

  18. 18

    この単純なSpring構成を実行するために引数なしのコンストラクターが必要なのはなぜですか?

  19. 19

    typescriptを使用するためにタイピングが必要なのはなぜですか?

  20. 20

    Scalaパターンマッチングが `s" $ var "`をサポートしないのはなぜですか?

  21. 21

    「カスタマイズされたEnumコンストラクター」が他のすべてのEnum型の情報を返すのはなぜですか?

  22. 22

    Haskellが内包表記のパターンマッチングを許可しないのはなぜですか?

  23. 23

    Foreach-Objectコマンドレットを実行するためにEnterキーを2回押す必要があるのはなぜですか?

  24. 24

    ユニオンでのパターンマッチングに到達不能なパターン警告があるのはなぜですか?

  25. 25

    gen_serverがパターンマッチングを考慮しないのはなぜですか?

  26. 26

    パターンマッチングの代わりにヘッド/テールを使用すると、評価が終了するのはなぜですか?

  27. 27

    最高のパフォーマンスを得るために、バッファを64バイト境界に揃える必要があるのはなぜですか?

  28. 28

    Javaでシングルトンパターンを設計するときに、なぜダブルチェックロックが必要なのですか?

  29. 29

    パターンマッチングがPythonでこの結果を返すのはなぜですか?

ホットタグ

アーカイブ