2016-12-09 3 views
1

私は抽象データ型を定義しました。私はこれをかなり一般的かつスケーラブルにしたいと考えました。スララで代数データ型を使用するときの一般的なメソッドの定義

しかし、スカラ型システムは私に悪夢を与えています。

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] 

私はオブジェクトのインスタンスを渡す必要があるので、これは愚かです。

thisTree[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)) 
    } 
} 

まだコンパイラは私を行かせない、エラーは実際に同じです。 どうすればこの問題を解決できますか?

+0

まあである必要があり、あなたがサブツリーを評価したいと仮定していますop(left.evaluateTree()) ' – Kolmar

答えて

0

あなたの受信機が台無しになっているようです。 evaluateTreeは引数をとりません。 `:私はあなたがオブジェクトのデザインを使用して、それをやりたいから、あなたが最初のsnipetのメソッドの代わりに、関数を呼び出すべきである、op(evaluateTree(left))のように代わりにop(left.evaluateTree())

def evaluateTree(): A = this match { 
    case Leaf(value) => value 
    case Branch_A1(op, left) => op(left.evaluateTree()) 
    case Branch_A2(op, left, right) => op(left.evaluateTree(),right.evaluateTree()) 
} 
+0

あなたは絶対に正しいです。私は寝ていた、スカラタイプのシステムは、私には明らかなことさえ見ていないような苦労を私に与えている。私はそれが型システムのいくつかの問題だと仮定します。 –

関連する問題