scala-如何推断返回类型

时间:2018-09-07 13:36:57

标签: scala types return type-inference

能否请您向我解释您如何推断退货类型?见下文。谢谢。

   val examples = sc.textFile(params.input).map { line =>
          Vectors.dense(line.split(' ').map(_.toDouble))
        }

[编辑] 我的意思是您如何推断结果类型。谢谢。

2 个答案:

答案 0 :(得分:1)

类型推断的工作形式是从前到后。

RDD.map(lambda)

在主表达式中调用的最后一个方法是RDD[whatever the lambda returns],它返回一个Vectors.dense(line.split(' ').map(_.toDouble))

Vectors.dense(doubles)

然后,在lambda主表达式中调用的最后一个方法是Vector,它返回一个line.split(' ').map(_.toDouble)

RDD.map[B]

最后这一行无关紧要,因为Vector没有类型参数,因此没有任何推断。

因此,如果将所有togheter放回去,则返回类型为RDD [Vector]。

表达式的类型是它最后计算的一段代码的类型。如果它是带有类型参数的方法,在这种情况下为def method[T](value:T) = { val a = value val b = a val c = b c } method("Foo") ,则从用于绑定该参数的表达式中推断出该类型参数B。

为什么要转发?这是一个例子。

method("Foo")

{{1}}返回一个字符串,因为从后到前=> c的类型,b的类型,a的类型,value的类型,T的类型,最后T的类型为String。

答案 1 :(得分:0)

将其转换为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
}