2015-04-28 50 views
0

我想要得到斯卡拉特質和案例類的掛鉤。以下是對this question的跟進。斯卡拉價值是不是類型參數的成員

假設我有一個簡單的類和一個擴展它的對象。

sealed trait Operations{ 
    def add(a:Double,b:Double):Double 
    def multiply(a:Double,b:Double):Double 
} 

case object CorrectOperations extends Operations{ 
    def add(a:Double,b:Double):Double = a+b 
    def multiply(a:Double,b:Double):Double= a*b 
} 

現在我有一些功能,這將使使用Operations類型的任何對象,如,

def doOperations(a:Double,b:Double, op:Operations)={ op.multiply(a,b) - op.add(a,b)}. 

這個效果很好,但我的問題是如何推廣的類型特徵Operations的,所以我們不只是在談論Doubles。所以我想爲特徵Operations設置通用類型,然後爲每個對象輸入規格。

使用類型泛型,我試圖

sealed trait Operations[T]{ 
    def add(a:T,b:T):T 
    def multiply(a:T,b:T):T 
} 

case object CorrectOperations extends Operations[Double]{ 
    def add(a:Double,b:Double):Double = a+b 
    def multiply(a:Double,b:Double):Double= a*b 
} 

def doOperations[T](a:T,b:T, op:Operations[T])={ op.multiply(a,b) - op.add(a,b) }, 

與編譯錯誤在doOperations - 「值 - 是不是類型參數T的成員」。

因此我們知道op.multiply(a,b)將返回類型T,並且該錯誤將指示類型T沒有.-方法。

我該如何思考如何實現Operations這個特徵的泛化?由於

回答

2

在你的問題的情況下,你應該引入subtract方法到您的Operations特點,這樣就可以提供證據證明T有這樣的方法(當然不是這樣,但也不減法從方法從另一個到T)。

sealed trait Operations[T] { 
    def add(a: T, b: T): T 
    def multiply(a: T, b: T): T 
    def subtract(a: T, b: T): T 
} 

case object CorrectOperations extends Operations[Double]{ 
    def add(a: Double, b: Double): Double = a + b 
    def multiply(a: Double, b: Double): Double = a * b 
    def subtract(a: Double, b: Double): Double = a - b 
} 

def doOperations[T](a: T, b: T, op: Operations[T]) = 
    op.subtract(op.multiply(a,b), op.add(a,b)) 

這基本上是Numeric特徵所做的。

+0

+1提的數字。另外,看看Numeric如何添加Ops類以讓您使用'-'而不是'subtract' –

1

你碰到的問題是,有從您的add結果減去你的multiply結果在你的類型的類沒有-(減)操作徒勞地尋找在T類型的運營商。

嘗試增加minus到您的類型類:

sealed trait Operations[T]{ 
    def add(a:T,b:T):T 
    def multiply(a:T,b:T):T 
    def minus(a:T,b:T):T 
} 

def doOperations[T](a:T,b:T, op:Operations[T])= 
    op.minus(op.multiply(a,b) - op.add(a,b)) 
相關問題