=>
徹底的なパターンマッチングは素晴らしいですが、ケース( )演算子の左側でのみ機能するように見えます。
関数(または式)の出力をその列挙にバインドできることを人が確認できる方法があるかどうか知りたいです。目標は、列挙から項目を出力するのを忘れたときにコンパイラーに通知させることです。
私の例では、3つの項目を含む次の列挙を使用します。
object MyEnum {
sealed trait t
case object E1 extends t
case object E2 extends t
case object E3 extends t
}
そして、これがコンパイル時の警告を生成するパターンマッチ式です(すでに知っているように):
def foo( e : MyEnum.t ) : Boolean =
e match {
case MyEnum.E1 => true
case MyEnum.E2 => false
case MyEnum.E3 => true // if we leave this line out, we get a warning
}
MyEnum.E3
網羅的ではないパターンマッチングを引用して、パターンマッチング式を省略した場合、Scalaは文句を言います。これは非常に有益ですが、逆のことが可能かどうか疑問に思います。
MyEnum.t
の右側のすべてのケースを説明できます=>
か?
これを強調する例を次に示します。
def bar( s : String ) : Option[MyEnum.t] =
s match {
case "a" => Some(MyEnum.E1)
case "b" => Some(MyEnum.E2)
case "c" => Some(MyEnum.E3) // if we leave this out, no warning
case _ => None
}
この例では、の行を省略した場合MyEnum.E3
、コンパイラーは何も問題がないかのように続行します。私が言いたいアサーションは次のとおりです。
forall MyEnum.t (aliased as e) there exists Some(e) | None
これはランタイムテストで簡単にカバーできることは理解していますが、これを静的にチェックする方法があるかどうか知りたいです。
ありがとう。