我有两个foldLeft的例子,我不能真正理解它的逻辑。
第一个示例:
val donuts: List[String] = List("Plain", "Strawberry", "Glazed")
println(donuts.foldLeft("")((acc, curr) => s" $acc, $curr Donut ")) // acc for accumulated, curr for current这会给
、普通甜甜圈、草莓甜甜圈、釉面甜甜圈
foldLeft不是积累了之前的值吗?我还以为结果会是
、普通甜甜圈、普通草莓甜甜圈、草莓上光甜甜圈
第二个示例:
def multi(num:Int,num1:Int):Int=num*10
(1 until 3).foldLeft(1)(multi)有人能解释一下每一步都发生了什么吗?我看不出这怎么会变成100。另外,第二个参数multi是一个函数。为什么它不接受任何输入变量(num和num1)?
发布于 2022-03-27 20:51:08
foldLeft不是积累了之前的值吗?
是的。它是以前迭代和当前元素的使用结果,并产生新的结果(使用您提供的二进制操作符),因此对于第一个示例,接下来的步骤如下:
""的起始值acc = "",curr = "Plain" -> " , Plain Donut "acc = " , Plain Donut ",curr = "Strawberry" -> " , Plain Donut , Strawberry Donut "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是序列元素类型)。当multi与B == A == Int匹配并传递给foldLeft时,foldLeft将在每个步骤上提供输入变量。
发布于 2022-03-27 21:45:05
左折叠需要三样东西:要处理的列表、初始值和函数。
该函数接受列表中的每个元素,并将其应用于初始值。每次,初始值都是前一个函数应用程序的结果。
总结一个列表是一个很好的玩具例子。
val nums = List(1, 2, 3, 4)
val total = nums.foldLeft(0)((a, b) => a + b)total是10。
该初始值必须传递所需的所有状态。当前,您传递累积字符串。您应该传递的是一个元组,它为您的函数提供了要处理的额外信息:累积字符串,以及表示列表中的前一个元素的字符串。
您的结果将类似于:
("Plain donut, ...", "Glazed")然后,您只需要选择出累积的字符串并丢弃第二个元素。
https://stackoverflow.com/questions/71640016
复制相似问题