具有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) _
这种不一致的原因是什么?
f
是方法,而不是函数。您可以在此处了解一些区别。
f12
是f
通过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] 删除。
我来说两句