val x = (x:Int, y:Int) => (_:Int) + (_:Int)
val y = (_:Int) + (_:Int)
在上述Scala函数字面量中,当我调用第一个函数(例如:x(2,3))时,它并不会返回和(即5),而是返回另一个结果,比如res0。当我调用res0(2,3)时,它才会返回给我和。然而第二个函数则在第一次调用时就返回了答案(例如:y(2,3)将直接返回5)。
请问有人能解释为什么第一个函数不能在第一次调用时直接返回和呢?我已经在REPL中尝试过了。
可能有助于将x
和y
的完整类型写出来,如下所示:
val x: (Int, Int) => (Int, Int) => Int =
(a: Int, b: Int) => (_: Int) + (_: Int)
val y: (Int, Int) => Int =
(_: Int) + (_: Int)
这里我们看到,当x
被应用于两个参数时,它会返回另一个类型为的函数。
(Int, Int) => Int
(_: Int) + (_: Int)
等同于
(a: Int, b: Int) => a + b
val x = (x:Int, y:Int) => (_:Int) + (_:Int)
等同于
val x = (x : Int, y : Int) => ((arg1:Int, arg2:Int) => (arg1:Int) + (arg1:Int))
虽然
val y = (_:Int) + (_:Int)
等同于
(x:Int, y:Int) => (x:Int) + (x:Int)
foo => bar
是一个函数,它接受foo
并返回bar
。提示2:_ + _
是一个接受两个参数并返回它们之和的函数(它基本上是(x, y) => x + y
的语法糖,这意味着每当你看到_ + _
时,你可以在脑海中将其替换为(x, y) => x + y
)。提示3:将提示1和提示2结合起来,那么逻辑上foo => _ + _
是什么?将上述内容翻译为中文:foo => _ + _
是一个函数,它接受两个参数并返回它们的和。其中,foo
可以是任何类型的输入,因为它并没有被使用到。 - Jörg W Mittag