私は抽象データ型を定義しました。私はこれをかなり一般的かつスケーラブルにしたいと考えました。スララで代数データ型を使用するときの一般的なメソッドの定義
しかし、スカラ型システムは私に悪夢を与えています。
sealed trait Tree[+A] {
def evaluateTree(): A = this match {
case Leaf(value) => value
case Branch_A1(op, left) => op(evaluateTree(left))
case Branch_A2(op, left, right) => op(evaluateTree(left),evaluateTree(right))
}
}
case object EmptyTree extends Tree[Nothing]
case class Leaf[A](value: A) extends Tree[A]
case class Branch_A1[A](op: A => A, left: Tree[A]) extends Tree[A]
case class Branch_A2[A](op: (A,A) => A, left: Tree[A], right: Tree[A]) extends Tree[A]
、例えばあろうダブル。だからこの場合、私は1つと2つの引数(Branch_A1、Branch_A2)の関数を表すブランチを持つツリーを持っています
しかし、それはコンパイルされません。 op(evaluateTree(left))
では、「そのような参照で解決することはできません」と言います。
私はクラスから離れた機能をより機能的なパターンにすることができましたが、私はオブジェクトデザインに従ってそれをやりたいのです。コンパイルするには唯一の方法があります:
sealed trait Tree[+A] {
def evaluateTree(t: Tree[A]): A = this match {
case Leaf(value) => value
case Branch_A1(op, left) => op(evaluateTree(left))
case Branch_A2(op, left, right) => op(evaluateTree(left),evaluateTree(right))
}
}
case object EmptyTree extends Tree[Nothing]
case class Leaf[A](value: A) extends Tree[A]
case class Branch_A1[A](op: A => A, left: Tree[A]) extends Tree[A]
case class Branch_A2[A](op: (A,A) => A, left: Tree[A], right: Tree[A]) extends Tree[A]
私はオブジェクトのインスタンスを渡す必要があるので、これは愚かです。
this
がTree[A]
であることをコンパイラに伝える必要があります。だから私は試してみました:
sealed trait Tree[+A] {
this: Tree[A] =>
def evaluateTree(): A = this match {
case Leaf(value) => value
case Branch_A1(op, left) => op(evaluateTree(left))
case Branch_A2(op, left, right) => op(evaluateTree(left),evaluateTree(right))
}
}
まだコンパイラは私を行かせない、エラーは実際に同じです。 どうすればこの問題を解決できますか?
まあである必要があり、あなたがサブツリーを評価したいと仮定していますop(left.evaluateTree()) ' – Kolmar