查看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)(_(_))为什么会出现这个编译时错误?
发布于 2013-12-23 17:18:42
使用apply,您希望将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中的apply:
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)(_(_))https://stackoverflow.com/questions/20736523
复制相似问题