【发布时间】:2013-08-23 05:58:22
【问题描述】:
我在研究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 => F[B],f => map(fa)(f) 如何等同于A => F[B]?
【问题讨论】:
标签: scala monads typeclass scalaz