[英]scala - how to infer the return type
你能解释一下你是如何推断返回类型的吗? 见下文。 谢谢你。
val examples = sc.textFile(params.input).map { line =>
Vectors.dense(line.split(' ').map(_.toDouble))
}
[编辑] 我的意思是你如何推断结果类型。 谢谢你。
类型推断是从前向后工作的。
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))
然后,在 lambda 主表达式中调用的最后一个方法是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,因为,从后到前=> c 的类型,即b 类型,即a 类型,即value 类型,即T 类型,最后T 是字符串类型。
将其转换为 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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.