为什么Scala在分配给val时需要部分应用curried函数?

Mar*_*utt 11 scala currying

在Scala中,为什么curry函数可以很容易地直接传递给其他函数,但是当将它分配给一个函数时还val需要部分应用它_?例如,给定两个功能:

def curried(a: Int)(b: Int) = a + b
def test(a: Int, f: Int => Int) = f(a)
Run Code Online (Sandbox Code Playgroud)

我可以很容易地传递curriedtest:

test(5, curried(5))
Run Code Online (Sandbox Code Playgroud)

一切都很快乐.但是,如果我只是打电话给curried(5)我得到一个错误:

scala> curried(5)
<console>:9: error: missing arguments for method curried;
follow this method with `_' if you want to treat it as a partially applied function
              curried(5)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将调用更改为包含类型信息,则可以:

val 'curried: Int => Int = curried(5)
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释不一致背后的理性,当然Scala编译器可以推断该函数是否Int => Int在原始方法上给出了类型定义?

Dan*_*ral 8

问题不是推断类型,问题是推断你的意图.你犯了一个错误,还是故意干嘛这个功能?

唉,尾随下划线语法是形式语法,省略它是语法糖.