2013-09-01 2 views
2

에서 재귀 유형에 실패 I 다음 예제 코드가 있습니다스칼라 패턴 매칭은 2.10

이 코드는 컴파일 및 2.9.x에서 제대로 실행
trait Recurse[T <: Recurse[T]] { 
    def method = "This is a method on recurse" 
} 

class Foo extends Recurse[Foo] { 
    override def toString = "This is a foo" 
} 

object Example { 
    def generate: Recurse[_ /*<: Recurse[_]*/] = new Foo() 
    def main(args: Array[String]) { 
    val foo = generate 
    foo match { 
     case m: Foo => println("match: " + m) 
     case _ => println("baa") 
    } 
    println(foo.method) 
    } 
} 

(출력 "경기 :이 foo는이다" "이 다음을 재발에 관한 방법입니다. "), 2.10.2에서는 작동하지 않습니다. 대신 컴파일 타임 오류가 발생합니다. 형식 인수 [_ $ 1]이 특성을 따르지 않습니다. Recurse의 형식 매개 변수 범위 [T < : Recurse [T]]

흥미로운 점은이 문제는 패턴 매칭 기. 일치 항목을 제거하면 코드가 컴파일되고 코드는 "이것은 재귀 방식입니다"라고 출력합니다.

더욱 흥미로운 점은 패턴 일치가 기본 케이스 인 경우에도 컴파일이 실패한다는 것입니다. 컴파일러는 패턴 매치를위한 재귀 적 실존 유형을 가진 객체를 받아들이지 않습니다. 그러나 foo의 값이 명시 적으로 지정된 경우 ("val foo = new Foo()") 또는 type 매개 변수가 재귀가 아닌 경우 2.10에서도 코드가 컴파일됩니다.

여기에 무슨 일이 일어나고 있습니까? type 매개 변수가 어떤 식 으로든 일치와 관련되지 않은 경우에도 패턴 일치가 중단되는 이유는 무엇입니까? 2.10과 호환되는 방식으로 이것을 다시 쓸 수있는 방법이 있습니까?

답변

1

저는이 문제가 Scala 컴파일러에서 회귀라고 생각합니다. 왜 file it?