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

时间:2013-03-08 22:37:28

标签: scala currying

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

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

我可以轻松地将curried传递给test

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吗?

2 个答案:

答案 0 :(得分:8)

问题不是推断类型,问题是推断你的意图。你犯了一个错误,或者你是否故意为这个功能加油?

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

答案 1 :(得分:0)

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

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

currying,语法明显。

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

currying,明显的语法

def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd 
cur,糖语法。但后来:

val normer = zscore(7, 0.4) _   

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