2016-08-26 4 views
3

Scalaでパターンマッチングがパターンマッチの完全性にマッチした場合、なぜガーディングが行われますか?スカラパターンマッチングガードは、パターンマッチングの徹底を破りますか?

[email protected]:~/dev/bitcoins-core$ sbt console 
[info] Loading project definition from /home/chris/dev/bitcoins-core/project 
[info] Set current project to bitcoin-s-core (in build file:/home/chris/dev/bitcoins-core/) 
[info] Starting scala interpreter... 
[info] 
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> sealed trait A 
defined trait A 

scala> case class B() extends A 
defined class B 

scala> case class C() extends A 
defined class C 

scala> val b : A = B() 
b: A = B() 

scala> b match { case b : B =>() } 
<console>:15: warning: match may not be exhaustive. 
It would fail on the following input: C() 
     b match { case b : B =>() } 
    ^

scala> b match { case b : B if b.isInstanceOf[B] =>() } 

scala> 

最後の行には徹底的な警告はありません。ここに何か不足していますか?

答えて

3

これはopen issueあるように見えます。

A comment by Adriaan Moors

私はそれは期待はずれだ理解し、警備員がある場合、我々は救済なぜそれは非常に直感的ではないのですが、それは彼らのユーティリティしばらく損なうとして、当社の主要な設計目標は、偽の警告を持っているではありません多くのユーザーを悩ます。

+1

しかし最近の結果は、可能なことについての推測を含むZauggのPRです。 「これはなぜこういうの?」という完全な答え。それらの部分的な結果が含まれます。このような場合、ガード状態はどうなると思いますか?直感的には、明らかに証明可能なケースもあるようです。 –

+2

私はちょっと私が知っているものに答えました - もっと書くこと自由に感じてください:) –

+0

私はあなたが何を意味知っている! –

0

isInstanceOfが使用されている2番目のケースでコンパイラが警告を出すことはできません。ユーザーが変数bの型情報を知っていると考えている可能性があります。

シナリオ1

scala> b match { case b : B if b.isInstanceOf[B] =>() } 

scala> def f(b: A) = b match { case b : B if b.isInstanceOf[B] =>() } 
f: (b: A)Unit 

scala> f(C()) 
scala.MatchError: C() (of class C) 
    at .f(<console>:14) 
    ... 33 elided 

シナリオ2

scala> val b: A = C() 
b: C = C() 

scala> b match { case b : B if b.isInstanceOf[B] =>() } 
scala.MatchError: C() (of class C) 
    ... 33 elided 
+0

「シナリオ2」には、「b」のタイプが既に分かっているため、パターンマッチングのポイントはありません。 –

+0

@ChrisStewartあなたは正しいです。 – pamu

+0

@ChrisStewartは – pamu

関連する問題