특정 깊이 집합의 트리를 만들려한다고 가정 해 봅시다. 즉, 트리 맨 위에서 임의의 리프 노드까지의 경로 길이는 고정 된 숫자입니다. 이상적으로, 유형 검사기는이 트리를 올바르게 작성하고 사용하는지 확인할 수 있습니다. 내 문제는 다음과 같이 구현했습니다.스칼라 - 설정된 깊이의 나무에 어떤 유형을 사용해야합니까?
import collection.mutable.HashMap
abstract class TreeNode[A, B] {
def insert(data: B, path: List[A])
}
class TwigNode[A, B] extends TreeNode[A, B] {
val hm = new HashMap[A, B]
def insert(data: B, path: List[A]) {
hm(path.head) = data
}
}
class BranchNode[A, B](depth: Int) extends TreeNode[A, B] {
val hm = new HashMap[A, TreeNode[A, B]].withDefaultValue(
if (depth == 2)
new TwigNode[A, B]
else
new BranchNode[A, B](depth - 1)
)
def insert(data: B, path: List[A]) {
hm(path.head).insert(data, path.tail)
}
}
그러나 유형 검사기가 여기 도움이되지 않습니다. 삽입 메서드 (또는 다른 메서드)에 버그가있는 경우 트리는 서로 다른 거리에있는 리프 노드로 끝날 수 있습니다. 모든 것이 정확하다는 것을 확인하기 위해 유형 검사기를 얻을 수 있습니까? 뭔가 미친 (유형 시스템에서 Peano 연산을 구현합니까?) 또는 BranchNode[BranchNode[BranchNode[BranchNode[TwigNode[A]]]]]
과 같은 추악한 유형이 있습니까?
맞습니다. 컴파일시 심도 제약이 필요하십니까? 왜 그게 필요한지 알 수 없습니다. –
@ om-nom-nom 예, 컴파일시입니다. 엄격하게 필요한 것은 아니며, 컴파일 시간을 검사하는 일은 없지만 이와 같이 코드에 버그를 작성하는 것이 더 어렵습니다. – wingedsubmariner