在Scala中,为什么咖喱函数可以很容易地直接传递给其他函数,但是当将它分配给val
时,还需要将其部分应用于_
?例如,给出的两个功能:为什么Scala在分配给val时需要部分应用curried函数?
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
?
在'val'的情况下,如果你给一个类型注解,你将不需要公开的部分应用程序'_'。 – 2013-03-08 23:19:58