繁体   English   中英

scala - 如何推断返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM