2013-10-30 2 views
0

예를 들어 가지와 잎이 추가 값을 포함하도록 확장 할 수있는 일반 트리 구조를 정의하고 있습니다 (예 : 이름 문자열을 추가 할 때 필요함).불쾌한 패턴 매치 버그 버그

그래서 그것은 다음과 같습니다

def test[Elem, T <: TreeLike[Elem, T]](tree: T): Unit = { 
    import TreeLike.{IsLeaf, IsBranch} 

    def printLeaves(b: T#Branch): Unit = b.iterator.foreach { 
    case IsLeaf(l) => println(l.value) 
    case IsBranch(c) => printLeaves(c) 
    } 

    printLeaves(tree.root) 
} 

오류는 다음과 같다 :

[error]   during phase: patmat 
[error]  library version: version 2.10.3 
[error]  compiler version: version 2.10.3 
... 
[error] symbol definition: case val x1: b.N 
[error]     tpe: b.N 
[error]  symbol owners: value x1 
[error]  context owners: value x0$1 -> value $anonfun -> method printLeaves -> 
    method test -> object Voodoo -> package typerbug 
... 
[error] no-symbol does not have an owner 

내가 patmat이있다 의심 불행하게도

trait TreeNodes { 
    val Node    = Either 
    type Node[+B, +L]  = Either[B, L] 
    val IsBranch   = Left 
    type IsBranch[+B, +L] = Left[B, L] 
    val IsLeaf   = Right 
    type IsLeaf[+B, +L] = Right[B, L] 
} 

object TreeLike extends TreeNodes { 
    trait BranchLike[Elem, B, L] { 
    type N = Node[B, L] 

    def iterator: Iterator[N] 
    } 

    trait LeafLike[Elem] { 
    def value: Elem 
    } 
} 
trait TreeLike[Elem, Repr] { 
    type Leaf <: TreeLike.LeafLike[Elem] 
    type Branch <: TreeLike.BranchLike[Elem, Branch, Leaf] 

    def root: Branch 
} 

, 패턴 매처 버그가 어쨌든 T#Branch에 문제가 있습니다. 어떤 아이디어라도 여기서 어떻게 해결할 수 있을까요?

나는 나뭇잎과 가지를 포장해도 행복하지 않다. Either. 이는 내가 LeafLikeBranchLike의 수퍼 유형을 정의하려고 시도했을 때 올바르게 구현되지 않았고 패턴 일치가 어떻게 이루어 졌는지를 파악할 때 물건이 빠져 나갔기 때문에 필요했습니다. 올바른 추출기를 얻으려면. 그래서 아마도 Either을 사용하는 것은 나쁜 생각이 아닙니다.

+0

Scala 2.11.0-M6을 사용할 때 컴파일러가 충돌하지 않습니다 ... –

+0

[SI- 7891] (https://issues.scala-lang.org/browse/SI-7891) 그 메시지에 대한 긴 버그 목록이 있습니다 :/ –

+0

@SRI interesting ... 그 티켓은 말하지 않습니다 그러나 2.11.0-M6에서 해결할 수 있습니다. 아마도이 예제는 거기에 첨부해야합니다. –

답변

0

유형 별칭 N은 "문제"(WTF)입니다.

trait BranchLike[Elem, B, L] { 
    def iterator: Iterator[Node[B, L]] 
    } 

이렇게하면 컴파일됩니다. 이 구조체를 계속 붕괴 시키려한다면이 구조체를 계속 만들지 않을 것입니다 :-(