微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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可能会导致更快的执行.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐