ある一定の深さのツリーを作成したいとします。つまり、ツリーの最上部から任意の葉ノードまでのパス長は固定数です。理想的には、型チェッカーは、これらのツリーを正しく作成し使用していることを検証できます。私の問題のために、私は次のようなものを実装:スカラ - 設定された深さのツリーにはどのようなタイプを使用しますか?
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