Тип вывода работает с обратной стороны.
sc.textFile(file).map { line => Vectors.dense(line.split(' ').map(_.toDouble)) }
Последний метод, вызванный в вашем основном выражении, - RDD.map(lambda)
, который возвращает RDD[whatever the lambda returns]
.
Vectors.dense(line.split(' ').map(_.toDouble))
Тогда последний метод, вызываемый в основном выражении лямбды, - это Vectors.dense(doubles)
, который возвращает Vector
.
line.split(' ').map(_.toDouble)
Наконец, эта строка не имеет значения, потому что Vector не имеет параметров типа, поэтому нечего выводить.
Итак, если поставить все вместе, тип возвращаемого значения - RDD [Vector].
Тип выражения - это тип его последнего оцениваемого фрагмента кода. Если это метод с параметрами типа, в данном случае RDD.map[B]
, то параметр типа B выводится из выражения, используемого для привязки этого параметра.
Зачем обратно вперед? Вот вам пример.
def method[T](value:T) = {
val a = value
val b = a
val c = b
c
}
method("Foo")
method("Foo")
возвращает строку, потому что от начала до конца =>
тип c, который имеет тип b, который имеет тип a, который имеет значение типа, который имеет тип T, и, наконец, T имеет тип String.