折叠左一行的类型推断?

sc_*_*ray 5 scala type-inference fold

我试图按如下方式反转整数列表:

List(1,2,3,4).foldLeft(List[Int]()){(a,b) => b::a}
Run Code Online (Sandbox Code Playgroud)

我的问题是有没有指定种子一些办法List[_],其中_是Scala的类型推断机制,自动填充,而不必指定类型的类型List[Int]

谢谢

rol*_*lve 5

更新:在阅读了有关Scala类型推断的更多内容之后,我找到了更好的答案.这篇关于Scala类型推断的局限性的文章说:

Scala中的类型信息从函数参数流向其结果[...],从参数列表的左到右,以及从第一个到最后一个跨语句.这与具有完全类型推断的语言形成对比,其中(粗略地说)类型信息在所有方向上不受限制地流动.

所以问题是Scala的类型推断相当有限.它首先查看第一个参数列表(在您的情况下为列表),然后在第二个参数列表(函数)中查看.但它不会回头.

这就是为什么这个

List(1,2,3,4).foldLeft(Nil){(a,b) => b::a}
Run Code Online (Sandbox Code Playgroud)

也不是这个

List(1,2,3,4).foldLeft(List()){(a,b) => b::a}
Run Code Online (Sandbox Code Playgroud)

将工作.为什么?首先,签名foldLeft定义为:

 foldLeft[B](z: B)(f: (B, A) => B): B 
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用Nil第一个参数z,编译器将分配Nil.type给type参数B.如果你使用List(),编译器将使用List[Nothing]B.

现在,f完全定义了第二个参数的类型.在你的情况下,它也是

(Nil.type, Int) => Nil.type
Run Code Online (Sandbox Code Playgroud)

要么

(List[Nothing], Int) => List[Nothing]
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,lambda表达式(a, b) => b :: a都无效,因为它的返回类型被推断为List[Int].


请注意,上面的粗体部分表示"参数列表"而不是"参数".文章后来解释说:

键入信息不流向由左到右的参数列表中,只有从左至右跨越参数列表.

所以如果你有一个带有单个参数列表的方法,情况会更糟.