scala 值不是类型参数的成员

scala value is not a member of type parameter

我正在尝试掌握 Scala 特性和案例 classes。以下是 .

的跟进

假设我有一个简单的 class 和一个扩展它的对象。

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 - "value - is not a member of type parameter T" 处出现编译错误。

所以我们知道 op.multiply(a,b) 将 return 键入 T,并且错误将指示类型 T 没有 .- 方法。

我应该如何考虑实现这种特质 Operations 的概括?谢谢

在你的问题的上下文中,你应该在你的 Operations 特征中引入一个 subtract 方法,这样你就可以提供证据表明 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 特性的作用。

您 运行 遇到的问题是您的类型 class 中没有 -(减号)操作可以从 [=] 中减去 multiply 结果13=] 结果毫无结果地在类型 T.

上寻找该运算符

尝试将 minus 添加到您的类型 class:

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))