1

让我们定义f一个支持柯里化的函数:

def f(a: Int)(b: Int) = a + b

此代码无法编译

def g= f(1)
<console>:10: error: missing arguments for method f;
follow this method with `_' if you want to treat it as a partially applied function
   def g= f(1)

我找到了这两种解决方法:

scala> def h = f(1) _
h: Int => Int

scala> def i : Int => Int = f(1)
i: Int => Int

但我不明白为什么推理引擎在这种微不足道的情况下需要帮助?

4

1 回答 1

5

这是因为def f(a: Int)(b: Int)不是函数,而是具有多个参数列表的方法。Scala 并没有将它们统一为一个概念,因此您也必须区分它们。

如错误消息所示,要部分应用具有多个参数列表的方法(并因此将此方法隐式转换为函数),您必须在方法后添加下划线。当您明确告诉编译器您想要哪个签名时,它还可以隐式地将方法转换为函数(如您的第二个解决方法中所示)。

如果你想在 Scala 中使用柯里化,最好从头开始创建一个函数:

scala> val f = (a: Int) => (b: Int) => a+b
f: Int => (Int => Int) = <function1>

scala> val g = f(1)
g: Int => Int = <function1>
于 2013-11-10T16:30:31.737 回答