为什么scala无法在部分方法中推断出类型?

Fre*_*ind 9 types scala partial-application

看这个例子:

def hello(a:String, b:String) = println(a + ":" + b)
val m1 = hello("aaa", _ )
m1("bbb")
Run Code Online (Sandbox Code Playgroud)

它无法编译,我需要将类型添加到partial方法:

val m1 = hello("aaa", _: String)
Run Code Online (Sandbox Code Playgroud)

为什么scala不知道方法的第二个参数helloString什么?

Kip*_*ros 15

Scala的类型推断是基于流的.方法和函数需要显式参数类型,用于推断其他类型.无法从方法或函数体推断出参数类型.但是,有时参数类型是从外部上下文中获知的,因此不必标记.两个例子,

val f: String => Unit = hello("aaa", _)
val s = Seq(1,2).map(_+1) // Seq[Int].map expects a function of Int argument type
Run Code Online (Sandbox Code Playgroud)

以下是Martin Odersky关于Scala类型推断与ML和Haskell相比的局限性的引用.挑战包括Scala的重载,记录选择和子类型,以及保持简单的需要,

Scala没有Hindley/Milner类型推断的原因是很难将其与诸如重载(ad-hoc变体,而不是类型类),记录选择和子类型等功能结合起来.我不是说不可能 - 存在许多包含这些功能的扩展; 事实上,我自己也是其中一些人.我只是说在实践中很难使这项工作很好,需要有小型表达式和良好的错误信息.这也不是一个关闭案例 - 许多研究人员正在努力推动这里的界限(例如在Remy的MLF中查看).但是现在,它是更好的类型推理与更好地支持这些功能的权衡.你可以两种方式进行权衡.我们想要与Java集成的事实倾向于支持子类型和远离Hindley/Milner.

来源:发表评论通用类型推断是一件坏事.