Scalaz`F [_]:Applicative`类型约束如何暗示使用隐式参数?

Rot*_*sor 5 scala typeclass scalaz implicits

我正在努力理解TraverseScalaz 中trait中的以下函数定义:

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)
}
Run Code Online (Sandbox Code Playgroud)

在这里,为了traverse适用于某种类型F,需要Applicative[F]在范围内引入类型的隐式对象.

我想了解几件事:

  1. Wat究竟F[_] : Applicative是什么意思?
  2. 为什么F[_]有关系Applicative?我们需要Applicative[F],而不是F [某事]扩展适用权吗?
  3. 为什么此方法在Applicative[F]不声明隐式参数的情况下使用类型的隐式值?

Jea*_*let 6

我认为所有这三个问题都可以用这个表示法来回答:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]
Run Code Online (Sandbox Code Playgroud)

相当于:

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

第一符号被称为一个约束上下文F[_].