我正在学习Scalaz 7,类型类系统太抽象了,有一件我不明白的就是为什么Bind.ap
是以这样的方式由bind
实现的。为什么Bind.ap是通过Bind.bind在Scalaz中实现的7
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 => F[B]
,怎么f => map(fa)(f)
相当于A => F[B]
?
谢谢,这真的很有帮助。最容易混淆的部分是'bind(f)(f => map(fa)(f))'的第二个参数的名称,应该改为'bind(f)(g => map(fa) )' – smilingleo