12

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

def curried(a: Int)(b: Int) = a + b
def test(a: Int, f: Int => Int) = f(a)

我可以很容易地传递curriedtest

test(5, curried(5))

一切都很幸福。但是,如果我只是打电话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)

但是,如果我将调用更改为包含类型信息,它将起作用:

val 'curried: Int => Int = curried(5)

谁能解释不一致背后的原因,Scala编译器肯定可以推断出该函数是Int => Int在原始方法上给出了类型定义的吗?

4

2 回答 2

8

问题不在于推断类型,问题在于推断您的意图。是你犯了错误,还是你故意对函数进行了柯里化?

唉,结尾的下划线语法是正式语法,省略它是语法糖。

于 2013-03-08T22:44:13.157 回答
1

并不总是需要下划线。来自http://docs.scala-lang.org/cheatsheets/

val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd 

柯里化,明显的语法。

def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd 

柯里化,明显的语法

def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd 

柯里化,糖的语法。但是之后:

val normer = zscore(7, 0.4) _   

需要尾随下划线来获取部分,仅适用于糖版本。

于 2015-10-29T22:24:23.210 回答