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不知道方法的第二个参数hello是String什么?
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.
来源:发表评论通用类型推断是一件坏事.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |