首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Applicative#traverse

实现Applicative#traverse
EN

Stack Overflow用户
提问于 2013-12-10 03:17:01
回答 1查看 89关注 0票数 0

Scala中的函数编程Applicative#traverse定义为:

代码语言:javascript
复制
def traverse[A,B](as: List[A])(f: A => F[B]): F[List[B]]
    as.foldRight(unit(List[B]()))((a, fbs) => map2(f(a), fbs)(_ :: _))

但是,我将这一职能作为:

代码语言:javascript
复制
  def traverse[A,B](as: List[A])(f: A => F[B]): F[List[B]] =
    as.foldRight(unit(List[B]()))((elem, acc) => map2(acc, f(elem))(_ :+ _))

unitmap2定义为:

代码语言:javascript
复制
  def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[C]
  def unit[A](a: => A): F[A]

在我理解我的实现时,map2(acc, f(elem))(_ :+ _))的行为将是这样的:

对于每个(元素、累加器),调用map2(acc,f(elem)(_ :+ _))将f(elem) (类型FB)的结果附加到累加器(F[ListB]类型)

因此,对于我的实现,在(f: (A,B) => C)部分的traversemap2调用中,List[B]会将B附加到自己。

map2接受参数F[A]F[B],但是函数参数fAB类型上运行。在Scala解决方案中的FP中,B通过::运算符添加到List[B]中。

是那么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 02:08:02

你对正在发生的事情的理解是正确的。但是,请注意,您的实现将按照预期的相反顺序生成一个列表,因此如果您使用identity monad作为F,您将得到一个相反的列表,而不是相同的列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20485363

复制
相关文章

相似问题

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