【问题标题】:Scala functional literalsScala 函数文字
【发布时间】:2025-12-21 11:45:07
【问题描述】:
  1. val x = (x:Int, y:Int) => (_:Int) + (_:Int)
  2. val y = (_:Int) + (_:Int)

在 Scala 中的上述两个函数文字中,当我调用第一个(例如: x(2,3) )时,它不会返回总和。相反,它返回另一个结果,比如 res0。当我调用 res0(2,3) 时,它会返回总和。而第二个则在第一次调用中返回答案(例如:y(2,3) 给我 5)。

有人能解释一下为什么第一个调用本身没有返回总和(即 5)吗?

我在 REPL 中尝试过。

【问题讨论】:

  • 提示 #1:foo => bar 是一个接收 foo 并返回 bar 的函数。提示 #2:_ + _ 是一个函数,它接受两个参数并返回它们的总和(它基本上是 (x, y) => x + y 的语法糖,这意味着每当您看到 _ + _ 时,您都可以在心理上将其替换为 (x, y) => x + y)。提示#3:将#1 和#2 放在一起,那么逻辑上foo => _ + _ 是什么?

标签: scala literals


【解决方案1】:

像这样写出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

【讨论】:

  • 刚刚遇到一个叫做柯里化的概念。第一个和currying一样吗?
  • @user3103957 是的...第一个是柯里化。
【解决方案2】:
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)

【讨论】: