Scala:パス依存型でのパターンマッチング

eprst

ここでScala2.13がパターンマッチングに不満を持っている理由を理解できません

  trait A {
    sealed trait T
    case class TImpl() extends T
  }

  trait Fail[B <: A] {
    val a: B // no error if `a: A`
    def foo(t : a.T): Unit = t match {
      case _: a.TImpl => // "match may not be exhaustive. It would fail on the following input: TImpl()"
    }
  }

合理的な回避策はありますか?Dottyで問題ないようです

Dmytro Mitin

原則としてパターンマッチングが完全ではない理由を知りたい場合は、たとえば次の例を参照してください。

trait A {
  sealed trait T
  case class TImpl() extends T
}

trait Fail[B <: A] {
  val a: B
  def foo(t : a.T): Unit = t match {
    case _: a.TImpl => 
  }
}

class B extends A
val b = new B
class FailImpl extends Fail[b.type] {
  override val a: b.type = b
}
val fail: Fail[b.type] = new FailImpl

class C
case class CImpl() extends C with b.T
val x = CImpl()
fail.foo(x) // MatchError

実際にはなかったと言えますCまあ、コンパイラはそれを理解するのに十分賢いはずです。

警告をオフにしたい場合は、次のように書くことができます。 @unchecked

def foo(t : a.T): Unit = (t: @unchecked) match {
  case _: a.TImpl => 
}

仕様によると、

パターン一致のセレクターが封印されたクラスのインスタンスである場合、パターン一致のコンパイルは、特定のパターンのセットが網羅的ではない、つまりMatchError実行時に発生する可能性があることを診断する警告を発行できます

https://scala-lang.org/files/archive/spec/2.13/08-pattern-matching.html#pattern-matching-expressions

コンパイラ警告出すことができますが、そうしなければなりませしたがって、警告がないからといって、パターンマッチングが完全であるとは限りません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Scalaでの型推論とパターンマッチング

分類Dev

Scalaでのパターンマッチング中の誤った型推論

分類Dev

パターンマッチからパス依存型を返す

分類Dev

Scalaでのケースクラスとのパターンマッチング

分類Dev

Scalaの非ケースクラスでのパターンマッチング

分類Dev

アクタークラスでのScalaパターンマッチング

分類Dev

Swiftでの列挙型パターンマッチング

分類Dev

Scalaでのパターンマッチングの速度

分類Dev

ScalaのTrylazy valでのパターンマッチング?

分類Dev

Scala数値型パターンマッチング

分類Dev

(Try、Try)でのscalaパターンマッチング

分類Dev

Scalaでの奇妙なパターンマッチング

分類Dev

SpringInterceptorでのURLパスパターンマッチング

分類Dev

JavaScriptでの関数型プログラミングスタイルのパターンマッチング

分類Dev

Scala:パターンマッチングでのスーパータイプ演算子の使用

分類Dev

パターンマッチングはクラスに依存

分類Dev

Haskell:カスタムデータ型とのパターンマッチング

分類Dev

2.10の再帰型ではScalaパターンマッチングが失敗する

分類Dev

パターンマッチングを使用するためのScalaのコンパイル時型定数

分類Dev

パターンマッチング方法及びクラス型パラメータの型推論の間の差

分類Dev

Pythonでのリストのパターンマッチング

分類Dev

Scalaでのタイプレベルのパターンマッチング

分類Dev

異なるタイプのSeqでのScalaパターンマッチング

分類Dev

オプションのScalaパターンマッチング

分類Dev

Scala:タプルのパターンマッチング

分類Dev

型のパターンマッチング

分類Dev

理解のためのscalaパターンマッチング

分類Dev

型制約のあるジェネリッククラスでのF#パターンマッチング

分類Dev

_ *使用法はscalaパターンマッチングです

Related 関連記事

  1. 1

    Scalaでの型推論とパターンマッチング

  2. 2

    Scalaでのパターンマッチング中の誤った型推論

  3. 3

    パターンマッチからパス依存型を返す

  4. 4

    Scalaでのケースクラスとのパターンマッチング

  5. 5

    Scalaの非ケースクラスでのパターンマッチング

  6. 6

    アクタークラスでのScalaパターンマッチング

  7. 7

    Swiftでの列挙型パターンマッチング

  8. 8

    Scalaでのパターンマッチングの速度

  9. 9

    ScalaのTrylazy valでのパターンマッチング?

  10. 10

    Scala数値型パターンマッチング

  11. 11

    (Try、Try)でのscalaパターンマッチング

  12. 12

    Scalaでの奇妙なパターンマッチング

  13. 13

    SpringInterceptorでのURLパスパターンマッチング

  14. 14

    JavaScriptでの関数型プログラミングスタイルのパターンマッチング

  15. 15

    Scala:パターンマッチングでのスーパータイプ演算子の使用

  16. 16

    パターンマッチングはクラスに依存

  17. 17

    Haskell:カスタムデータ型とのパターンマッチング

  18. 18

    2.10の再帰型ではScalaパターンマッチングが失敗する

  19. 19

    パターンマッチングを使用するためのScalaのコンパイル時型定数

  20. 20

    パターンマッチング方法及びクラス型パラメータの型推論の間の差

  21. 21

    Pythonでのリストのパターンマッチング

  22. 22

    Scalaでのタイプレベルのパターンマッチング

  23. 23

    異なるタイプのSeqでのScalaパターンマッチング

  24. 24

    オプションのScalaパターンマッチング

  25. 25

    Scala:タプルのパターンマッチング

  26. 26

    型のパターンマッチング

  27. 27

    理解のためのscalaパターンマッチング

  28. 28

    型制約のあるジェネリッククラスでのF#パターンマッチング

  29. 29

    _ *使用法はscalaパターンマッチングです

ホットタグ

アーカイブ