2016-08-26 2 views
3

스칼라에서 패턴 일치가 철저히 일치하는 패턴을 찾을 때 왜 케이스를 지키고 있습니까?스칼라 패턴 매칭 가드가 패턴 매칭의 완전성을 깨뜨린 것입니까?

[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

같습니다.

A comment by Adriaan Moors :

나는 실망 이해하고, 경비가있을 때 우리가 구제 이유는 매우 직관적 아니지만, 그 자신의 유틸리티 동안을 훼손하는 것처럼 우리의 주요 설계 목표는 가짜 경고를하지 않는 것입니다 많은 사용자를 귀찮게합니다.

+1

그러나 더 최근의 결과는 Zaugg의 PR이 가능하다는 것에 대한 추측을 포함합니다. "왜 이런 식으로?"에 대한 완전한 대답? 그 부분적인 결과를 포함 할 것입니다. 이러한 경우 가드 상태에 대해 우리는 무엇을 기대해야합니까? 직관적으로, 어떤 경우는 명백하게 증명 될 수있는 것처럼 보입니다. –

+2

방금 ​​내가 알고있는 것에 대답했습니다. - 더 쓸 수 있으면 자유롭게 느낍니다. –

+0

나는 당신이 무슨 뜻인지 안다! –

0

isInstanceOf이 사용 된 두 번째 경우 컴파일러에서 경고를 제공 할 수 없으며 사용자가 변수 b의 유형 정보를 알고 있다고 생각하기 때문일 수 있습니다. 이것이 open issue처럼

시나리오 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

'b'의 유형이 이미 알려져 있기 때문에 '시나리오 2'에는 패턴 일치 지점이 없습니다. –

+0

@ChrisStewart 당신 말이 맞습니다. – pamu

+0

@ChrisStewart가 대답을 수정했습니다. – pamu