2016-08-26 3 views
2

У меня есть значение типа Seq[Array[Int]], и я хочу в итоге поставить Array[Int]. Я думал, что foldLeft будет работать, но на удивление он не делает:Как слить последовательность массивов в scala

scala> val arr1 = Array(1,2,3) 
arr1: Array[Int] = Array(1, 2, 3) 

scala> val arr2 = Array(4,5,6) 
arr2: Array[Int] = Array(4, 5, 6) 

scala> val seq = Seq(arr1, arr1) 
seq: Seq[Array[Int]] = List(Array(1, 2, 3), Array(1, 2, 3)) 

scala> seq.foldLeft (Array.empty)((x,y) => x ++ y) 
<console>:17: error: value ++ is not a member of Array[Nothing] 
     seq.foldLeft (Array.empty)((x,y) => x ++ y) 
               ^

Эта ошибка не кажется всей правды, хотя, потому что я могу сделать это:

scala> Array.empty 
res22: Array[Nothing] = Array() 

scala> Array.empty ++ arr1 ++ arr2 
res23: Array[Int] = Array(1, 2, 3, 4, 5, 6) 

Что это дает?

ответ

7

Как насчет seq.flatten.toArray?

Для foldLeft решения вы должны сказать типа для компилятора: Array.empty[Int], когда вы пропустили что [Int], компилятор выбрал Nothing как единственно возможный тип для Array.empty.

+0

Спасибо за объяснение. Я все еще знаком с выводами типа scala. Но вы правы, «seq.flatten.toArray» лучше. – doub1ejack

Смежные вопросы