Scala函数字面量

7
  1. val x = (x:Int, y:Int) => (_:Int) + (_:Int)
  2. val y = (_:Int) + (_:Int)

在上述Scala函数字面量中,当我调用第一个函数(例如:x(2,3))时,它并不会返回和(即5),而是返回另一个结果,比如res0。当我调用res0(2,3)时,它才会返回给我和。然而第二个函数则在第一次调用时就返回了答案(例如:y(2,3)将直接返回5)。

请问有人能解释为什么第一个函数不能在第一次调用时直接返回和呢?我已经在REPL中尝试过了。


5
提示1:foo => bar是一个函数,它接受foo并返回bar。提示2:_ + _是一个接受两个参数并返回它们之和的函数(它基本上是(x, y) => x + y的语法糖,这意味着每当你看到_ + _时,你可以在脑海中将其替换为(x, y) => x + y)。提示3:将提示1和提示2结合起来,那么逻辑上foo => _ + _是什么?将上述内容翻译为中文:foo => _ + _ 是一个函数,它接受两个参数并返回它们的和。其中,foo可以是任何类型的输入,因为它并没有被使用到。 - Jörg W Mittag
2个回答

9

可能有助于将xy的完整类型写出来,如下所示:

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

刚刚了解到一个叫做柯里化的概念。第一个和柯里化是一样的吗? - user3103957
1
@user3103957 是的... 第一个是柯里化。 - mukesh210

3
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接