2015-04-28 4 views
0

Я пытаюсь получить висячие черты Scala и классы case. Ниже приведено описание для this question.scala value не является членом типа параметр

Предположим, у меня есть простой класс и объект, который его расширяет.

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 - «значение - не является членом параметра типа Т».

Таким образом, мы знаем, что 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. Кроме того, посмотрите, как Numeric добавляет класс Ops, чтобы вы могли использовать '-' вместо' subtract' –

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)) 
Смежные вопросы