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]
提示确实解决了问题。