微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala:减少和折叠之间的函数类型推断的差异 – 可以做些什么吗?

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

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

map.foldLeft((0,0)){case((k1,v1),(k2,v2)) => (-1,-1)}

以下,看似精确的代码片段导致编译错误

map reduceLeft {case((k1,-1)}

错误是:

scala> map reduceLeft {case((k1,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)}

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

解决方法

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

Scala的类型推断一次运行一个参数列表.另外,在一个参数列表中推断的类型可用于在后面的那些(那些更右边)中引导或约束类型推断,其方式是它们无法帮助引导或约束给定参数列表内的类型推断.在这种情况下,Scala无法正确推断reduceLeft签名中的B类型:

def reduceLeft[B >: (A,B)](op: (B,(A,B)) ⇒ B): B

在折叠的情况下:

def foldLeft[B](z: B)(op: (B,B)) ⇒ B): B

它通过单独查看你的引物值((0,0))将一个类型绑定到B,然后它可用于推断函数中的参数类型(没有你明确表示).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐