我正在努力了解Scalaz的 Traverse 特性中的以下函数定义:
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]类型的隐式对象。

我想了解几件事:
  • Wat到底F[_] : Applicative是什么意思?
  • 为什么F[_]Applicative有关?我们需要Applicative[F],不是F [something]扩展适用性吗?
  • 为什么此方法在不声明隐式参数的情况下使用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]]
    

    第一种表示法称为F[_]context bound

    关于scala - Scalaz `F[_] : Applicative`类型约束如何暗含隐式参数的使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7109571/

    10-11 03:09