scala值不是类型参数

时间:2015-04-28 18:26:30

标签: scala typeclass

我试图了解Scala特征和案例类。以下是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。所以我想为trait 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 个答案:

答案 0 :(得分:2)

在您的问题的上下文中,您应该在subtract特征中引入Operations方法,以便您可以提供T具有此类方法的证据(以及它没有&# 39; 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特质的作用。

答案 1 :(得分:1)

您遇到的问题是类型类中没有-(减号)操作从multiply结果中减去add结果,无效地查找该运算符输入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))