scala方法与函数部分应用程序

时间:2014-04-23 20:58:01

标签: scala functional-programming currying partially-applied-type

在此,我想了解之间的区别:

val aCurriedfunc: Int => String => String = x => y => x + " " + y 
aCurriedfunc (2) 

def aCurriedMethod (x:Int) (y: String) = x + " " + y
aCurriedMethod (2) _ 

确实为什么第一种情况不需要“_”,但第二种情况需要它。 是的,一个是一个类型的函数,另一个是Sscala中没有真正类型的方法。然而,这种区别只是引出了我的第二个问题。

  • 这是否与eta扩展有关?

如果是的话

  • 如何区分部分应用的功能和eta扩展?

1 个答案:

答案 0 :(得分:3)

_中的curriedMethod (2) _要求编译器执行eta-expansion。结果是一个函数,之后无法(或需要)区分部分应用的函数和eta扩展的结果。

curriedMethod这样的方法中的单独参数列表实际上是作为单个方法实现的,并且所有参数都已组合在一起。无论如何都需要进行Eta扩展才能使方法成为函数,因此通过让eta-expansion创建的闭包关闭部分应用的参数来实现部分扩展。