我正在努力理解Traverse
Scalaz 中 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)
}
在这里,要traverse
为某种类型工作F
,需要Applicative[F]
在范围内引入一个类型的隐式对象。
我想了解几件事:
- 笏到底
F[_] : Applicative
是什么意思? - 为什么
F[_]
有关系Applicative
?我们需要Applicative[F]
,而不是 F[something] extends Applicative 对吗? - 为什么此方法使用类型的隐式值
Applicative[F]
而不声明隐式参数?