我正在學習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