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
. 이는 내가 LeafLike
및 BranchLike
의 수퍼 유형을 정의하려고 시도했을 때 올바르게 구현되지 않았고 패턴 일치가 어떻게 이루어 졌는지를 파악할 때 물건이 빠져 나갔기 때문에 필요했습니다. 올바른 추출기를 얻으려면. 그래서 아마도 Either
을 사용하는 것은 나쁜 생각이 아닙니다.
Scala 2.11.0-M6을 사용할 때 컴파일러가 충돌하지 않습니다 ... –
[SI- 7891] (https://issues.scala-lang.org/browse/SI-7891) 그 메시지에 대한 긴 버그 목록이 있습니다 :/ –
@SRI interesting ... 그 티켓은 말하지 않습니다 그러나 2.11.0-M6에서 해결할 수 있습니다. 아마도이 예제는 거기에 첨부해야합니다. –