Scala匿名函数语法使用部分应用程序?

时间:2015-09-28 11:21:52

标签: scala

我通过以下一些示例来学习specs2测试框架。

我注意到以下匿名函数语法重复出现:

val upper = (_: String).toUpperCase

相当于更传统/通常的

val upper = (s: String) => s.toUpperCase

虽然语法简单且优雅,但它不是familiar (easy)

有人可以引导我了解第一种语法是如何工作/派生的吗?我非常确定它与某种部分应用程序有关,但无法完全解释。

Scala中经常使用的语法是什么? (我还在这里学习绳索:])

编辑::

我发现使用这种语法的重复模式是ad-hoc多态(简单地说,是重载的方法/函数),其中传递函数的参数类型决定调度哪个函数。

例如,

def f(g: Int => String): String = g(10)
def f(g: String => String): String = g("hello")
f((_: Int).toString + " beers") // 10 beers 
f((_: String) + " world") // hello world

这种模式在ScalaCheck等库中反复出现。

1 个答案:

答案 0 :(得分:2)

语法表示编译器正在创建一个类型为String的参数的函数,该函数根据参数顺序插入到使用_的位置。如果你有:

val f = (_:String).length + (_:Int) 

它将创建一个函数(String, Int) => Int,其中每个_标记参数的使用位置。订单很重要!必须按照希望函数参数的顺序使用它们

如果在声明val时已经定义了类型,则可以在函数体中省略它们:

val f: (String, Int) => Int = _.length + _