Предположим, я хочу создать деревья определенной заданной глубины, то есть длина пути от вершины дерева до любого конечного узла является некоторым фиксированным числом. В идеале, средство проверки типов сможет проверить, правильно ли вы создаете и используете эти деревья. Для моей проблемы я реализовал что-то вроде:
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)
}
}
Но проверка типов здесь мне не помогает. Если есть ошибка в методе вставки (или любом другом методе), дерево может закончить с листовыми узлами на разных расстояниях. Можно ли заставить средство проверки типов проверить, все ли правильно, прибегнуть к чему-то сумасшедшему (реализовать арифметику Пеано в системе типов?) Или иметь уродливые типы, такие как BranchNode[BranchNode[BranchNode[BranchNode[TwigNode[A]]]]]
?