2015-04-28 47 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)) 
相关问题