使用`map2`实现Applicative#apply

时间:2013-12-23 03:17:04

标签: scala

查看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)(_(_))

为什么会出现编译时错误?

1 个答案:

答案 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)(_(_))