Я пытаюсь параметризовать некоторые методы с очень общими параметрами типа.Типы Scala: минимальные верхние границы
В качестве примера, в РЕПЛ я сначала определить:
trait Term
case class FunctionalTerm[+T <: Term](t: T) extends 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
в РЕПЛ дает следующее сообщение об ошибке:
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)
^
Я потратил около двух дней, пытаясь найти решение, и теперь я полностью застрял. Я больше ничего не могу найти в Google.
Поскольку список аргументов типа из ex2
такой же, как и ex1
но с T1
и T2
поменялись местами, я не понимаю, это не так, и как это исправить.
Любая помощь была бы чрезвычайно оценена!
Обновление
Наименее верхние границы были красная сельдь. Пример может быть дополнительно удален.
Следующие две функции могут быть определены в РЕПЛ без ошибок:
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
, кажется, вызывает проблему. Я могу определить следующее в РЕПЛ:
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
, не использованный в сигнатуре, имеет этот эффект?
Я забыл сказать, что я использую Scala 2.10-M3. –
Вы не используете более высокие виды, хотя :-) –
@oxbow_lakes Oh ... Я исправлю –