Scala:关于`foldLeft`的奇怪行为

时间:2015-10-20 23:55:59

标签: scala

定义:

val a = List(1, 2, 3, 4, 5, 6, 7)

请考虑以下foldLeft行:

a.foldLeft(""){case (num, sum) => sum + (num.toString + "-")}

我的期望是该计划将会:

<(>(((&#34; 7 - &#34; +&#34; 6 - &#34;)+&#34; 5 - &#34;)+&#34; 4-& #34;)+&#34; 3 - &#34;)+&#34; 2 - &#34;)+&#34; 1 - &#34;

7-6-5-4-3-2-1-

但我得到的是:7654321-------。为什么会这样?

2 个答案:

答案 0 :(得分:3)

您将参数混淆为foldLeft。查看List.foldLeft的文档。请注意,z“零”值与函数参数中的 second 参数具有相同的类型,而不是第一个。

这应该更接近预期:

a.foldLeft(""){case (sum, num) => sum + (num.toString + "-")}
// res0: String = 1-2-3-4-5-6-7-

但是,如果您想要按逆序排列数字,那么您可能需要使用foldRight。也许这首先是你想要的(注意参数numsum与你给出的顺序相同):

a.foldRight(""){case (num, sum) => sum + (num.toString + "-")}
// res1: String = 7-6-5-4-3-2-1-

答案 1 :(得分:1)

根据您的期望,我希望您期望foldRight行为:

scala> val a = List(1, 2, 3, 4, 5, 6, 7)
a: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

scala> a.foldRight(""){case (num, sum) => sum + (num.toString + "-")}
res0: String = 7-6-5-4-3-2-1-