我正在研究Scalaz 7,类型类系统是如此抽象,我无法理解的一件事是为什么以这种方式Bind.ap
实现。bind
trait Apply[F[_]] extends Functor[F] { self =>
def ap[A,B](fa: => F[A])(f: => F[A => B]): F[B]
....
}
trait Bind[F[_]] extends Apply[F] { self =>
/** Equivalent to `join(map(fa)(f))`. */
def bind[A, B](fa: F[A])(f: A => F[B]): F[B]
override def ap[A, B](fa: => F[A])(f: => F[A => B]): F[B] = bind(f)(f => map(fa)(f))
....
}
我知道我们可以将F[A => B]
其视为F[C]
,所以第一个参数bind
有意义,但第二个参数需要 a A => F[B]
,如何f => map(fa)(f)
等效于A => F[B]
??