Как ограничение Scalaz `F [_]: Applicative` подразумевает использование неявных параметров? - PullRequest
5 голосов
/ 18 августа 2011

Я пытаюсь понять следующее определение функции в Traverse черта в Scalaz:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

Часть, которую я не понимаю, F[_] : Applicative.

Теперь, давайте посмотрим, что такое Applicative:

trait Applicative[Z[_]] extends Pointed[Z] with Apply[Z] {
  override def fmap[A, B](fa: Z[A], f: A => B): Z[B] = this(pure(f), fa)
  override def apply[A, B](f: Z[A => B], a: Z[A]): Z[B] = liftA2(f, a, (_:A => B)(_: A))
  def liftA2[A, B, C](a: Z[A], b: Z[B], f: (A, B) => C): Z[C] = apply(fmap(a, f.curried), b)
}

Здесь, для traverse работает для некоторого типа F, одиннужно ввести неявный объект типа Applicative[F] в область видимости.

Я хотел бы понять несколько вещей:

  1. Ват точно означает F[_] : Applicative значит?
  2. Почему F[_] имеет отношение к Applicative?Нам нужно Applicative[F], а не F [что-то] расширяет аппликативное право?
  3. Почему этот метод использует неявные значения типа Applicative[F] без объявления неявных параметров?

1 Ответ

6 голосов
/ 18 августа 2011

Я думаю, что на все три вопроса можно ответить с тем, что это обозначение:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

эквивалентно этому:

def traverse[F[_], A, B](f: A => F[B], t: T[A])(implicit $ev: Applicative[F]): F[T[B]]

Первая запись известна как привязанный к контексту для F[_].

...