我试图理解在Scala中部分应用程序的优点。 请考虑下面的代码: def sum(f: Int => Int) = (a: Int, b: Int) => f(a) + f(b) def sum2(f: Int => Int, a: Int, b: Int): Int = f(a) + f(b) def sum3(f: Int => Int)(a: Int, b: Int): Int = f(a) + f(b) val ho = sum({identity}) val partial = sum2({ identity }, _, _) […]
多个参数列表,例如def foo(a:Int)(b:Int) = {}和每个列表多个参数,例如def foo(a:Int, b:Int) = {}在语义上是等价的,大多数函数式语言只有一种声明多个参数的方法,例如F#。 我可以找出支持这两种函数定义的唯一原因就是允许使用只有一个参数的参数列表进行语法扩展。 def withBufferedWriter(file: File)(block: BufferedWriter => Unit) 现在可以用语法来调用 withBufferedWriter(new File("myfile.txt")) { out => out write "whatever" … } 但是,也可以有其他方法来支持使用大括号,而不需要多个参数列表。 一个相关的问题:为什么在Scala中使用多个参数列表叫做“currying”? 柯里化通常被定义为为了支持部分应用而使得n元函数一元化的技术。 然而,在Scala中,可以部分应用一个函数,而不用创build一个“curried”(多个参数列表,每个参数都有一个参数)版本的函数。
在Scala中,可以这样写(curried?)函数 def curriedFunc(arg1: Int) (arg2: String) = { … } 上面的curriedFunc函数定义与两个参数列表和具有多个参数的函数在单个参数列表中有什么区别: def curriedFunc(arg1: Int, arg2: String) = { … } 从math的angular度来看,这是(curriedFunc(x))(y)和curriedFunc(x,y)但是我可以写def sum(x) (y) = x + y , def sum2(x, y) = x + y 我只知道一个区别 – 这是部分应用function。 但是两种方式对我来说都是相同的。 还有其他的区别吗?