2013-05-12 50 views
4

這是我的文件斯卡拉REPL「錯誤:值>不是類型參數T的成員」

trait Set[T] { 
    def contains(x: T): Boolean 
    def incl(x: T): Set[T] 
    def union(that: Set[T]): Set[T] 
} 

class Empty[T] extends Set[T] { 
    override def toString = "." 
    def contains(x: T): Boolean = false 
    def incl(x: T): Set[T] = new NonEmpty[T](x, new Empty[T], new Empty[T]) 
    def union(that: Set[T]): Set[T] = that 
} 

class NonEmpty[T](elem: T, left: Set[T], right: Set[T]) extends Set[T] { 
    override def toString = "{" + left + elem + right + "}" 

    def contains(x: T): Boolean = 
     if (x < elem) left contains x 
     else if (x > elem) right contains x 
     else true 

    def incl(x: T): Set[T] = 
     if (x < elem) new NonEmpty(elem, left incl x, right) 
     else if (x > elem) new NonEmpty(elem, left, right incl x) 
     else this 

    def union(that: Set[T]): Set[T] = 
     ((left union right) union that) incl elem 
} 

我使用了「:粘貼」的方法,因爲:負載不工作。但我得到以下錯誤

<console>:25: error: value < is not a member of type parameter T 
       if (x < elem) left contains x 
        ^
<console>:26: error: value > is not a member of type parameter T 
       else if (x > elem) right contains x 
         ^
<console>:30: error: value < is not a member of type parameter T 
       if (x < elem) new NonEmpty(elem, left incl x, right) 
        ^
<console>:31: error: value > is not a member of type parameter T 
       else if (x > elem) new NonEmpty(elem, left, right incl x) 

我敢肯定,這個文件是正確的,因爲它是從類的例子,當教授利用在課堂上它的工作...

任何幫助?

回答

5

你得到那個錯誤,因爲不是每個類型T>,<等定義。

你可能想要的是TOrdered或者可以隱式轉換爲Ordered,因此定義了所有這些。

這應該可以解決錯誤消息:

class NonEmpty[T <% Ordered[T]](elem: T, left: Set[T], right: Set[T]) extends Set[T] { 
    override def toString = "{" + left + elem + right + "}" 

    def contains(x: T): Boolean = 
     if (x < elem) left contains x 
     else if (x > elem) right contains x 
     else true 

    def incl(x: T): Set[T] = 
     if (x < elem) new NonEmpty(elem, left incl x, right) 
     else if (x > elem) new NonEmpty(elem, left, right incl x) 
     else this 

    def union(that: Set[T]): Set[T] = 
     ((left union right) union that) incl elem 
} 

T <% S(結合的圖)表示,式T必須可轉換爲S,所以它必須是任一的S亞型或具有隱式轉換定義。

Accepter回答於this queston解釋更詳細。

+0

這個神奇的工作謝謝:) – morikalina 2013-05-12 11:57:55

0

由於「view bounds」已經在斯卡拉2.11,使用「context bounds」通用二叉搜索樹的另一種實現棄用低於:

object GenericBinarySearchTree { 

abstract class Set[T] { 
    def incl(x: T): Set[T] 
    def contains(x: T): Boolean 
    def union(that: Set[T]): Set[T] 
} 

type L[X] = X => Ordered[X] 

class Empty[T : L] extends Set[T] { 

    override def toString = "." 

    def incl(x: T): Set[T] = new NonEmpty(x, new Empty, new Empty) 

    def contains(x: T): Boolean = false 

    def union(that: Set[T]): Set[T] = that 
} 

class NonEmpty[T : L](elem: T, left: Set[T], right: Set[T]) extends Set[T] { 

    override def toString = "{" + left + elem + right + "}" 

    def incl(x: T): Set[T] = { 
    if(x > elem) new NonEmpty(elem, left, right.incl(x)) 
    else if(x < elem) new NonEmpty(elem, left.incl(x), right) 
    else this 
    } 

    def contains(x: T): Boolean = { 
    if(x == elem) true 
    else if(x > elem) right.contains(x) 
    else left.contains(x) 
    } 

    def union(that: Set[T]): Set[T] = ((left union right) union that) incl elem 
} 

}