Scala - 我应该为一组深度的树使用什么类型?

时间:2012-02-26 20:11:57

标签: scala types

假设我想创建一定深度的树,也就是说,从树顶到任何叶节点的路径长度都是固定数。理想情况下,类型检查器将能够验证您是否正确创建和使用这些树。对于我的问题,我实现了类似的东西:

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]]]]]这样丑陋的类型?

2 个答案:

答案 0 :(得分:4)

您想要的功能通常称为dependent type系统。目前还没有实现该功能的常用编程语言。 虽然您可以在C ++中生成或多或少的实用依赖类型系统,但它们看起来有点类似于BranchNode[BranchNode[BranchNode[BranchNode[TwigNode[A]]]]]

除了你已经考虑过的那些丑陋的东西之外什么都没有,在Scala中很实用。

虽然有一些数学方法可以构建和处理完整的树。但是要省略它们,因为你对它们的不感兴趣是可以预测的。

答案 1 :(得分:2)

这种事情需要依赖类型,Scala不支持。

然而,你可以通过在类型系统中使用教堂数字表示来实现它。