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

api – 为什么在Scala中fold具有以下类型?

发布时间:2020-12-16 18:17:57 所属栏目:安全 来源:网络整理
导读:我正在研究为immutable定义fold的方式.设置: def fold [A1 : A] (z: A1)(op: (A1,A1) ? A1): A1 但foldLeft定义为: def foldLeft [B] (z: B)(op: (B,A) ? B): B 对我来说这看起来很奇怪,至少乍一看,因为我期望折叠能够改变它返回的集合的类型,就像foldLeft
我正在研究为immutable定义fold的方式.设置:

def fold [A1 >: A] (z: A1)(op: (A1,A1) ? A1): A1

但foldLeft定义为:

def foldLeft [B] (z: B)(op: (B,A) ? B): B

对我来说这看起来很奇怪,至少乍一看,因为我期望折叠能够改变它返回的集合的类型,就像foldLeft那样.

我想这是因为foldLeft和foldRight保证了元素折叠的顺序.折叠给出的保证是什么?

解决方法

当您应用foldLeft时,您的起始值将与第一个列表元素组合.结果与第二个列表元素组合在一起.这个结果与第三个等等有关.最终,列表已折叠为与起始值相同类型的一个元素.因此,您只需要一些可以通过函数与list元素组合的类型.
对于foldRight,同样适用,但顺序相反.

fold不保证组合完成后的订单.并不保证它只在一个位置开始.折叠可能并行发生.因为您可以具有并行性,所以可以组合任何2个列表元素或返回值 – 这会为类型添加约束.

关于你的评论,你必须看到一个案例,订单有效:假设你使用折叠来连接一个字符列表,你想要一个文本作为结果.如果您的输入是A,B,C,您可能希望保留订单以接收ABC而不是ACB(例如).另一方面,如果您只是添加数字,则顺序无关紧要.总结1,2,3给出6个独立于添加的顺序.在这种情况下,使用fold而不是foldLeft或foldRight可能会导致更快的执行.

(编辑:李大同)

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

    推荐文章
      热点阅读