Scala:reduce和fold在函数类型推断上的差异-可以做些什么吗?

Scala:reduce和fold在函数类型推断上的差异-可以做些什么吗?,scala,type-inference,Scala,Type Inference,假设我有一张空地图 val-map=map[Int,Int]() 我很困惑,因为虽然以下代码可以正确编译: map.foldLeft((0,0)){case((k1, v1), (k2, v2)) => (-1, -1)} 以下看似精确的代码段导致编译错误: map reduceLeft {case((k1, v1), (k2, v2)) => (-1, -1)} 错误是: scala> map reduceLeft {case((k1, v1), (k2, v2)) =&

假设我有一张空地图
val-map=map[Int,Int]()

我很困惑,因为虽然以下代码可以正确编译:

map.foldLeft((0,0)){case((k1, v1), (k2, v2)) => (-1, -1)}
以下看似精确的代码段导致编译错误:

map reduceLeft {case((k1, v1), (k2, v2)) => (-1, -1)}
错误是:

scala> map reduceLeft {case((k1, v1), (k2, v2)) => (k1, v1)}
<console>:9: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, (Int, Int)) => ?
              map reduceLeft {case((k1, v1), (k2, v2)) => (k1, v1)}
scala>map reduceLeft{case((k1,v1),(k2,v2))=>(k1,v1)}
:9:错误:缺少扩展函数的参数类型
匿名函数的参数类型必须完全已知。(补充说明8.5)
预期类型为:(?,(Int,Int))=>?
map reduceLeft{case((k1,v1),(k2,v2))=>(k1,v1)}

这不是一个大问题,但显然不必处理这个问题会很好。你对我能做些什么有什么不同的想法吗,或者我必须学会接受它吗?

发生这种情况的原因是
foldLeft
有两个参数列表(第一个是初始“启动”值,第二个是函数),而
reduceLeft
只有一个(函数)

Scala的类型推断一次操作一个参数列表。此外,在一个参数列表中推断出的类型可用于指导或约束后面的参数列表中的类型推断(那些更右的参数列表),其方式无法帮助指导或约束给定参数列表中的类型推断。在这种情况下,Scala无法正确推断
reduceLeft
签名中的B类型:

def reduceLeft[B >: (A, B)](op: (B, (A, B)) ⇒ B): B 
在折叠情况下:

def foldLeft[B](z: B)(op: (B, (A, B)) ⇒ B): B
它通过单独查看primer值(
(0,0)
)将类型绑定到B,然后可以使用primer值推断函数中的参数类型(无需显式)