首页 文章

scala值不是类型参数的成员

提问于
浏览
0

我正试图了解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 - "value - is not a member of type parameter T" .

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

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

2 回答

  • 2

    在您的问题的上下文中,您应该在 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特质所做的 .

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

相关问题