首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:如何解释foldLeft

Scala:如何解释foldLeft
EN

Stack Overflow用户
提问于 2022-03-27 20:22:48
回答 2查看 106关注 0票数 2

我有两个foldLeft的例子,我不能真正理解它的逻辑。

第一个示例:

代码语言:javascript
复制
val donuts: List[String] = List("Plain", "Strawberry", "Glazed")
println(donuts.foldLeft("")((acc, curr) =>  s" $acc, $curr Donut ")) // acc for accumulated, curr for current

这会给

、普通甜甜圈、草莓甜甜圈、釉面甜甜圈

foldLeft不是积累了之前的值吗?我还以为结果会是

、普通甜甜圈、普通草莓甜甜圈、草莓上光甜甜圈

第二个示例:

代码语言:javascript
复制
def multi(num:Int,num1:Int):Int=num*10

(1 until 3).foldLeft(1)(multi)

有人能解释一下每一步都发生了什么吗?我看不出这怎么会变成100。另外,第二个参数multi是一个函数。为什么它不接受任何输入变量(num和num1)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-27 20:51:08

foldLeft不是积累了之前的值吗?

是的。它是以前迭代和当前元素的使用结果,并产生新的结果(使用您提供的二进制操作符),因此对于第一个示例,接下来的步骤如下:

  1. 累加器- ""的起始值
  2. acc = ""curr = "Plain" -> " , Plain Donut "
  3. acc = " , Plain Donut "curr = "Strawberry" -> " , Plain Donut , Strawberry Donut "
  4. acc = " , Plain Donut , Strawberry Donut "curr = "Strawberry" -> " , Plain Donut , Strawberry Donut , Glazed Donut"

对于第二个例子,简单地忽略了当前值--即multi可以重写为def multi(acc:Int, curr:Int):Int = acc*10,其中不实际使用curr,因此foldLeft只是将起始值(1)乘以10 n乘以,其中n是序列中的元素数(即,(1 until 3).length为2)。

为什么它不接受任何输入变量(num和num1)?

foldLeft接受函数的函数。它接受一个通用函数,它反过来接受两个参数并返回与第一个参数相同类型的结果(op: (B, A) => B,其中B是结果类型,A是序列元素类型)。当multiB == A == Int匹配并传递给foldLeft时,foldLeft将在每个步骤上提供输入变量。

票数 3
EN

Stack Overflow用户

发布于 2022-03-27 21:45:05

左折叠需要三样东西:要处理的列表、初始值和函数。

该函数接受列表中的每个元素,并将其应用于初始值。每次,初始值都是前一个函数应用程序的结果。

总结一个列表是一个很好的玩具例子。

代码语言:javascript
复制
val nums = List(1, 2, 3, 4)
val total = nums.foldLeft(0)((a, b) => a + b)

total10

该初始值必须传递所需的所有状态。当前,您传递累积字符串。您应该传递的是一个元组,它为您的函数提供了要处理的额外信息:累积字符串,以及表示列表中的前一个元素的字符串。

您的结果将类似于:

代码语言:javascript
复制
("Plain donut, ...", "Glazed")

然后,您只需要选择出累积的字符串并丢弃第二个元素。

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

https://stackoverflow.com/questions/71640016

复制
相关文章

相似问题

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