Scala中的curried函数背后的基本原理是什么?

dol*_*eng 3 scala currying

我是Scala的新手,对我来说似乎有点困惑,为什么Scala提供"curried functions",例如:

//curried function
def add(lhs: Int)(rhs: Int) = lhs + rhs
//so we can do partially binding like
val add1 = add(1)_
Run Code Online (Sandbox Code Playgroud)

它令人困惑,因为Scala已经为正常功能提供了"部分应用",例如,

//normal function
def add(lhs: Int, rhs: Int) = lhs + rhs
//also supports partially application
val add1 = add(1, _: Int) 
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:除了部分应用之外,除了Scala之外还有其他方面使用curried函数而不是普通函数吗?

EDT1:感谢您的回复.我想我从下面的所有答案中学到了新东西.

Tom*_*icz 8

把理论动机放在一边(参见:维基百科中关于currying的部分功能应用的对比),有一个实际的含义.当最后一个参数是代码块时,语法更简单,更易读.

比较以下方法:

def test1(name: String, callback: => Unit) {}
def test2(name: String)(callback: => Unit) {}
Run Code Online (Sandbox Code Playgroud)

第二种方法调用看起来更好,比较:

test("abc", {
    //some code
})

test2("abc") {
    //some code
}
Run Code Online (Sandbox Code Playgroud)


Kim*_*bel 5

  • 更好的语法:添加(1)而不是添加(1,_)
  • 从左到右参数列表键入推断.例如,这用于集合的折叠方法.
  • 隐式参数列表也需要它们.

当然你可以说最后两个可能是以不同的方式实现的.