Скала - как вывести тип возврата
Можете ли вы объяснить мне, как вы определяете тип возврата? увидеть ниже. благодарю вас.
val examples = sc.textFile(params.input).map { line =>
Vectors.dense(line.split(' ').map(_.toDouble))
}
[EDIT] Я имею в виду, как вы выводите тип результата. благодарю вас.
2 ответа
Вывод типа работает с обратной стороны.
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))
Затем последний метод, вызываемый в лямбда-выражении main 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")
возвращает String, потому что от back до forward => типа c, который имеет тип b, имеет тип a, имеет тип value, имеет тип T и, наконец, T имеет тип String.
Вместо этого преобразуйте его в DenseVector, чтобы определить правильный тип возвращаемого значения.
import org.apache.spark.mllib.linalg.{DenseVector, Vectors}
import org.apache.spark.rdd.RDD
val examples: RDD[DenseVector] = sc.textFile(file).map { line =>
Vectors.dense(line.split(' ').map(_.toDouble)).toDense
}