Скала - как вывести тип возврата

Можете ли вы объяснить мне, как вы определяете тип возврата? увидеть ниже. благодарю вас.

   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
}
Другие вопросы по тегам