假设我想创建一定深度的树,也就是说,从树顶到任何叶节点的路径长度都是固定数。理想情况下,类型检查器将能够验证您是否正确创建和使用这些树。对于我的问题,我实现了类似的东西:
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]]]]]
这样丑陋的类型?
答案 0 :(得分:4)
您想要的功能通常称为dependent type系统。目前还没有实现该功能的常用编程语言。
虽然您可以在C ++中生成或多或少的实用依赖类型系统,但它们看起来有点类似于BranchNode[BranchNode[BranchNode[BranchNode[TwigNode[A]]]]]
除了你已经考虑过的那些丑陋的东西之外什么都没有,在Scala中很实用。
虽然有一些数学方法可以构建和处理完整的树。但是要省略它们,因为你对它们的不感兴趣是可以预测的。
答案 1 :(得分:2)
这种事情需要依赖类型,Scala不支持。
然而,你可以通过在类型系统中使用教堂数字表示来实现它。