Я пытаюсь понять следующее определение функции в 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]
в область видимости.
Я хотел бы понять несколько вещей:
- Ват точно означает
F[_] : Applicative
значит? - Почему
F[_]
имеет отношение к Applicative
?Нам нужно Applicative[F]
, а не F [что-то] расширяет аппликативное право? - Почему этот метод использует неявные значения типа
Applicative[F]
без объявления неявных параметров?