首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`map2`实现Applicative#apply

使用`map2`实现Applicative#apply
EN

Stack Overflow用户
提问于 2013-12-23 11:17:04
回答 1查看 165关注 0票数 0

查看Functional Programming in Scala中的Applicative#apply,我在apply函数上得到一个编译时错误:

代码语言:javascript
复制
 C:\...\Applicative.scala:28: A does not take parameters
                              map2(fa, fab)(_(_))

下面是书中的代码:

代码语言:javascript
复制
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)(_(_))

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

EN

回答 1

Stack Overflow用户

发布于 2013-12-23 17:18:42

使用apply,您希望将A => B函数应用于F的计算上下文中的A。

map2允许您在F内部思考,同时将两个F组合为一个。

代码语言:javascript
复制
def map2[X,Y,Z](fx: F[X], fy: F[Y])(g: (X,Y) => Z): F[Z]

您必须提供两个F和一个组合内部内容的函数g。

因此,让我们考虑一下F中的apply:

代码语言:javascript
复制
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

代码语言:javascript
复制
def apply[A,B](fab: F[A => B])(fa: F[A]): F[B] =
  map2(fab, fa)(_(_))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20736523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档