繁体   English   中英

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

[英]Scala anonymous function syntax using partial application?

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

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

val upper = (_: String).toUpperCase

这相当于更常规/通常

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

尽管语法简单而优雅,但是并不是很熟悉简单

有人可以指导我了解第一种语法的工作方式/派生方法吗? 我很确定它与某种部分应用程序有关,但不能完全推理。

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

编辑::

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

例如,

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类的库中反复出现。

语法指示您正在使用参数类型String创建参数的编译器,该类型将根据参数顺序插入使用_位置。 如果你有:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM