查看Functional Programming in Scala中的Applicative#apply
,我在apply
函数上遇到编译时错误:
C:\...\Applicative.scala:28: A does not take parameters
map2(fa, fab)(_(_))
以下是本书中的代码:
trait Applicative[F[_]] extends Functor[F] {
// primitive combinators
def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[C]
[code omitted]
def apply[A,B](fab: F[A => B])(fa: F[A]): F[B] =
map2(fa, fab)(_(_))
为什么会出现编译时错误?
答案 0 :(得分:0)
通过申请,你想申请A => B在F的计算上下文中对A起作用。
map2让你在F中思考,同时将两个F组合成一个。
def map2[X,Y,Z](fx: F[X], fy: F[Y])(g: (X,Y) => Z): F[Z]
你必须提供两个F,以及一个结合了内部的函数g。
所以让我们在F里面思考一下:
X is a function with type A => B
Y is the argument with type A
and with g we combines these by applying A => B to A, so
Z is the result with type A)
以_ (_)
格式提供g时
你要说的是,你要将g的第一个参数应用于g的第二个参数。如果你写map2(fa, fab)
,g的第一个参数将是a: A
,第二个参数ab: A => B
。它不会进行类型检查,因为a(ab)
不正确,您想要的是ab(a)
。
TL; DR 交换两个参数fa和fab
def apply[A,B](fab: F[A => B])(fa: F[A]): F[B] =
map2(fab, fa)(_(_))