2015-10-20 6 views
0

Определить:Scala: На странное поведение `foldLeft`

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

Рассмотрим следующую строку с foldLeft:

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

Мое ожидание было, что программа будет делать:

((((«7-» + «6-») + «5-») + «4-») + «3-») + «2-») + «1-»

который 7-6-5-4-3-2-1-

Но я получаю: 7654321-------. Почему это так?

ответ

3

Вы перепутали параметры до foldLeft. Проверьте документацию на List.foldLeft. Обратите внимание, что значение z «нулевое» имеет тот же тип, что и параметр второй в аргументе функции, а не первый.

Это должно работать ближе к ожидаемому:

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

Однако, если вы хотите, чтобы цифры в обратном порядке-, то вы можете использовать foldRight. Может быть, это на самом деле то, что вы собираетесь в первую очередь (обратите внимание, что аргументы num и sum находятся в том же порядке, который вы дали):

a.foldRight(""){case (num, sum) => sum + (num.toString + "-")} 
// res1: String = 7-6-5-4-3-2-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- 
Смежные вопросы