加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 减少和折叠之间的差异

发布时间:2020-12-16 09:03:25 所属栏目:安全 来源:网络整理
导读:阅读这篇关于 Scala http://josephmoniz.github.io/blog/2013/04/04/scala-reduce-vs-fold/中的reduce vs fold的文章,它指出“你正在获取N的一些值并对其执行聚合操作,使得最终结果通常是某个值 = N”. 但是这个陈述是错误的,因为对N个值进行求和会产生一个
阅读这篇关于 Scala http://josephmoniz.github.io/blog/2013/04/04/scala-reduce-vs-fold/中的reduce vs fold的文章,它指出“你正在获取N的一些值并对其执行聚合操作,使得最终结果通常是某个值< = N”. 但是这个陈述是错误的,因为对N个值进行求和会产生一个值> = N? 更新:我认为< =在这种情况下意味着相同的类型或子类型

解决方法

我认为这是一个有缺陷的表征.最好像这样考虑折叠:

In:
  initial value
  way to combine stuff with initial value
  collection
Out:
  combined stuff

减少是这样的:

In:
  way to combine stuff
  collection
Out:
  combined stuff

也就是说,区别在于你是否有一个初始值(它可能与你在集合中的类型不同!),折叠,或者你是否只是折叠你已经拥有的值,如减少.

如果你有一个自然的零,即可以在不改变它结合的情况下组合的东西,那么你可以实现reduce作为从零开始的折叠.例如,对于乘法,零是1(因为1 * x == x),所以

List(1,2,3).fold(1){_ * _}
List(1,3).reduce{_ * _}

给出相同的答案. (但是,只有第一个在空列表中给出答案!)

要看一个折叠如何更加通用的例子,请考虑这个 – 这里有一个foldLeft,所以我们知道在操作的左侧传递初始值 –

List(1,3).foldLeft(List(0))((ns,n) => ns ++ List.fill(n+1)(n))

给出List(0,1,3,3).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读