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

我正在研究为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可能会导致更快的执行.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...