我正在努力理解 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[something] extends Applicative 对吗? Applicative[F]
的隐式值不声明隐式参数? 最佳答案
我认为这三个问题都可以用这个符号来回答:
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]]
第一个符号被称为 context bound为
F[_]
.
关于scala - Scalaz `F[_] : Applicative` 类型约束如何暗示使用隐式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109571/