[英]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.