Типы Scala: наименьшие верхние границы

Я пытаюсь параметризовать некоторые методы с параметрами очень общего типа.

В качестве примера, в REPL я сначала определяю:

trait Term
case class FunctionalTerm[+T <: Term](t: T) extends Term

Интуитивно следующий метод принимает Term и FunctionalTerm и возвращает что-то с типом наименьшей верхней границы типа переданного термина и типом аргумента FunctionalTerm:

def ex1[T1 <: Term, T3 <: X, FunctionalTerm[T1] <: X, X <: R, R <: Term](t1: FunctionalTerm[T1], s: T3): R = sys.error("TODO")

Пока все хорошо в REPL.

Затем я определяю ex2как вспомогательную функцию, которая выполняет ту же операцию, что и ex1, но с переставленными входными аргументами:

def ex2[T2 <: Term, T3 <: X, FunctionalTerm[T2] <: X, X <: R, R <: Term](s: T3, t2: FunctionalTerm[T2]): R = ex1(t2,s)

Попытка определить ex2в REPL выдает следующую ошибку:

error: inferred type arguments [T2,T3,FunctionalTerm,T3,T3] do not conform to method ex1's type parameter bounds [T1 <: Term,T3 <: X,FunctionalTerm[T1] <: X,X <: R,R <: Term]
         ex1(t2,s)
         ^
error: type mismatch;
 found   : FunctionalTerm[T2]
 required: FunctionalTerm[T1]
         ex1(t2,s)
             ^
error: type mismatch;
 found   : T3(in method ex2)
 required: T3(in method ex1)
         ex1(t2,s)
                ^
error: type mismatch;
 found   : R(in method ex1)
 required: R(in method ex2)
         ex1(t2,s)
            ^

Я потратил около двух дней, пытаясь найти решение, и теперь полностью застрял. В гугле больше ничего не могу найти.

Поскольку список аргументов типа ex2такой же, как и у ex1, но с переставленными местами T1и T2, я не Не понимаю, это неправильно, или как это исправить.

Мы будем очень признательны за любую помощь!

Обновление

Наименьшие верхние границы были отвлекающим маневром. Пример можно перегнать дальше.

Следующие две функции могут быть определены в REPL без ошибок:

def ex1[T1 <: Term, FunctionalTerm[T1] <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex1")
def ex2[T2 <: Term, FunctionalTerm[T2] <: Term](t2: FunctionalTerm[T2]): Term = ex1(t2)

Введение дополнительного параметра X, по-видимому, вызывает проблему. Я могу определить в REPL следующее:

def ex3[T1 <: Term, FunctionalTerm[T1] <: X, X <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex3")

Но попытка последующего определения:

def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)

дает ошибку:

error: inferred type arguments [T2,FunctionalTerm,Nothing] do not conform to method ex3's type parameter bounds [T1 <: Term,FunctionalTerm[T1] <: X,X <: Term]
       def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
                                                                                               ^
error: type mismatch;
 found   : FunctionalTerm[T2]
 required: FunctionalTerm[T1]
       def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
                                                                                                   ^

Итак, я думаю, возникает вопрос: Почему параметр Xне используется в подпись имеет такой эффект?

6
задан Andrew Bate 16 May 2012 в 19:21
поделиться