gpt4 book ai didi

Scala:reduce 和 Fold 之间函数类型推断的差异 - 可以对此采取措施吗?

转载 作者:行者123 更新时间:2023-12-02 04:27:38 26 4
gpt4 key购买 nike

假设我有一张空 map
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)}

这不是一个大问题,但显然不必处理这个问题会很好。您对我可以采取哪些不同的做法有什么想法,还是我必须学会接受它?

最佳答案

发生这种情况的原因是 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

它通过单​​独查看您的引物值 ((0, 0)) 将类型绑定(bind)到 B,然后可以使用该引物值来推断函数中的参数类型(无需将它们明确显示) .

关于Scala:reduce 和 Fold 之间函数类型推断的差异 - 可以对此采取措施吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com