【发布时间】:2010-12-25 18:00:48
【问题描述】:
我们在Scala中部分应用了函数-
def sum(a:Int,b:Int,c:Int) = a+b+c
val partial1 = sum(1,_:Int,8)
我想知道使用部分应用函数有什么好处。还是只是句法上的补充?
【问题讨论】:
我们在Scala中部分应用了函数-
def sum(a:Int,b:Int,c:Int) = a+b+c
val partial1 = sum(1,_:Int,8)
我想知道使用部分应用函数有什么好处。还是只是句法上的补充?
【问题讨论】:
关于一般的部分应用函数,“Programming in Scala, 2nd edition”一书中提到:
考虑这种表达方式的另一种方式,其中下划线 用于表示整个参数列表,是作为一种转换 def 转换成函数值。
例如,如果您有一个本地函数,例如sum(a: Int, b: Int, c: Int): Int,您可以将其“包装”在一个函数值中,该函数值的 apply 方法具有相同的参数列表和结果类型。
scala> def sum(a: Int, b: Int, c: Int) = a + b + c
sum: (a: Int,b: Int,c: Int)Int
scala> val a = sum _
a: (Int, Int, Int) => Int = <function3>
(这里,a(1, 2, 3) 是以下的简写形式:
scala> a.apply(1, 2, 3)
res12: Int = 6
)
虽然您不能将方法或嵌套函数分配给变量,或者将其作为参数传递给另一个函数,但如果您将方法或嵌套函数包装在函数值中,则可以通过放置名称后加下划线。
【讨论】:
优点是sum(1,_,8) 比x => sum(1,x,8) 更少打字和阅读。
仅此而已。
【讨论】:
sum(1,_,8) 比 x => sum(1,x,8) 更容易输入和读取
但是,两者都不合法;您必须提供参数类型。
【讨论】: