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?

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 это новое имя для недавно введенного неявного параметра. Этот параметр называется параметром доказательства.

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

Другие вопросы по тегам