在Scala中返回部分应用的函数

克鲁兹斯托夫·斯沃文斯基

具有f定义为的功能

def f(i1: Int, i2: Int)(i3: Int) = i1 + i2 + i3

可以使用以下方法定义部分应用的函数_

val f12 = f(1, 2) _  // f12: Int => Int = <function>
f12(3)  // res0: Int = 6

现在,当我从某个函数返回部分应用的函数时,不需要使用_

def f23(f: (Int, Int) => Int => Int) = f(2, 3)  // f23: (f: (Int, Int) => Int => Int)Int => Int
val f23f = f23(f)  // f23f: Int => Int = <function>
f23f(4)  // res1: Int = 9

如果将其_放在f23定义中,则会出现错误消息:

def f23(f: (Int, Int) => Int => Int) = f(2, 3) _
Error:(6, 49) _ must follow method; cannot follow Int => Int
def f23(f: (Int, Int) => Int => Int) = f(2, 3) _

这种不一致的原因是什么?

w

f是方法,而不是函数。您可以在此处了解一些区别

f12f通过eta扩展派生的函数它不是部分功能。APartialFunction是在输入值的有限域内定义的函数。例如,如果f12仅针对Int小于500的值进行定义,而对于大于500的输入值未进行定义,则它将是部分函数。

def f23(f: (Int, Int) => Int => Int) = f(2, 3) _

之所以失败f,是因为如此处定义,该函数具有2个Int值并返回具有anInt并返回an的函数Int在这种情况下,下划线应该代表什么?f(2,3)是一个返回Int=>Int函数的完整调用有点像写作5 + 7 _目前尚不清楚_替代什么

另一方面,您可以执行以下操作:... = f(2,3)(_)那么很明显,返回的函数是在缺少_参数(即参数)的情况下调用的与相同... = f(2,3)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章