Scala reduceLeft的扩展函数缺少参数类型
对于以下一系列转换方法,Scala reduceLeft的扩展函数缺少参数类型,scala,Scala,对于以下一系列转换方法,IntellijIDE似乎“理解”了正在发生的事情:它没有注意到任何错误/警告,并且正确地显示了数据类型: val recsWithNames = recsWithNamesAndCnts.map(_._1) .reduceLeft{ case (dfCum: DataFrame,dfNew: DataFrame) => dfCum.union(dfNew)} 以下是类型推断: 但是,它不编译: Error:(426, 68) missing param
Intellij
IDE似乎“理解”了正在发生的事情:它没有注意到任何错误/警告,并且正确地显示了数据类型:
val recsWithNames = recsWithNamesAndCnts.map(_._1)
.reduceLeft{ case (dfCum: DataFrame,dfNew: DataFrame) => dfCum.union(dfNew)}
以下是类型推断
:
但是,它不编译:
Error:(426, 68) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, org.apache.spark.sql.DataFrame) => ?
val recsWithNames = recsWithNamesAndCnts.map(_._1).reduceLeft{ case (dfCum: DataFrame,dfNew: DataFrame) => dfCum.union(dfNew)}
这是reduceLeft
的一种模式,因此我通常会转换成foldLeft
。具体而言,以下各项确实有效:
但在这种情况下,可能有人会对导致此错误的
reduceLeft
的特殊细微差别提供一些见解。reduceLeft
和foldLeft
具有以下特征:
def reduceLeft[B >: A](op: (B, A) => B): B
def foldLeft[B](z: B)(op: (B, A) => B): B
两者都涉及一个采用函数2的op
,因此在没有案例
匹配的情况下,两者都可以正常工作:
(dfCum: DataFrame, dfNew: DataFrame) => dfCum.union(dfNew)
// Or, shorthanded to:
_ union _
另一方面,case(dfCum,dfNew)=>dfCum.union(dfNew)
是函数1
(特别是Tuple2的部分函数)。编译器能够在foldLeft
中解释它并推断类型B
,但不能在reduceLeft
中(我的猜测是由于B>:A
)。如果你能帮编译器一点忙,它就会起作用:
reduceLeft[DataFrame]{ case (dfCum, dfNew) => dfCum.union(dfNew) }
reduceLeft
和foldLeft
具有以下签名:
def reduceLeft[B >: A](op: (B, A) => B): B
def foldLeft[B](z: B)(op: (B, A) => B): B
两者都涉及一个采用函数2的op
,因此在没有案例
匹配的情况下,两者都可以正常工作:
(dfCum: DataFrame, dfNew: DataFrame) => dfCum.union(dfNew)
// Or, shorthanded to:
_ union _
另一方面,case(dfCum,dfNew)=>dfCum.union(dfNew)
是函数1
(特别是Tuple2的部分函数)。编译器能够在foldLeft
中解释它并推断类型B
,但不能在reduceLeft
中(我的猜测是由于B>:A
)。如果你能帮编译器一点忙,它就会起作用:
reduceLeft[DataFrame]{ case (dfCum, dfNew) => dfCum.union(dfNew) }
很好。三个月后,我又回到了这个问答环节。。并且可以确认[DataFrame]
提示确实解决了问题。v nice。三个月后,我又回到了这个问答环节。。并且可以确认[DataFrame]
提示确实解决了问题。