Scala — параметры типа метода

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

У меня есть следующий класс:

trait Arrow1[F[_, _]]

abstract class Test {

  def f1[F[_, _] : Arrow1, A, B, C](fa: F[A,B], fb: F[A, C]): F[A, (B, C)]

  def f2[A: Seq, B](a: A): Boolean
}

После того, как я декомпилировал файл класса, сигнатура методов f1 и f2 выглядит так:

public abstract class Test {
    public abstract <F, A, B, C> F f1(F var1, F var2, Arrow1<F> var3);

    public abstract <A, B> boolean f2(A var1, Seq<A> var2);
}

Как видите, у методов есть дополнительный параметр. Где я могу найти документацию об этом обозначении параметра типа метода F[_, _] : Arrow1 ?


person Octavian R.    schedule 12.08.2018    source источник
comment
На самом деле его можно пометить как дубликат: Что такое контекст Scala и границы представления?, но я решил оставить кавычки из текущей спецификации вместо перенаправления на ответ от 2010 года (не то, чтобы многое изменилось в отношении границ контекста, но все же...).   -  person Andrey Tyukin    schedule 13.08.2018


Ответы (1)


Вы ищете "контекстные границы".

Когда вы ищете "Введите параметры" в спецификации, вы встретите A: B в первом абзаце, а также получите ссылку на Границы контекста и границы просмотра, где написано (цитата немного изменена, упрощена для случая с одним контекстом привязано):

Параметр типа A метода или класса, не относящегося к признакам, также может иметь одну или несколько границ контекста A : T. В этом случае параметр типа может быть конкретизирован для любого типа S, для которого существует свидетельство в точке инстанцирования, что S удовлетворяет границе T. Такое свидетельство состоит из неявного значения типа T[S].

Метод или класс, содержащие параметры типа с ограничениями представления или контекста, рассматриваются как эквивалентные методу с неявными параметрами. Сначала рассмотрим случай с одним параметром [...] с контекстными границами, такими как:

def f[A: U1](params): R = ...

Затем определение метода, приведенное выше, расширяется до

def f[A](params)(implicit v1: U1[A]): R  = ...

где v1 — новое имя для вновь введенного неявного параметра. Этот параметр называется параметром доказательства.

Вот ссылка на часто задаваемые вопросы с дополнительной информацией по теме. .

person Andrey Tyukin    schedule 12.08.2018
comment
Спасибо за ответ. - person Octavian R.; 13.08.2018