柯里化 Currying
柯里化(Currying)技术 Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的)。它是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
/**
知识点
1.scala底层支持柯里化技术,柯里化技术来自于函数式编程
可以将接收多个参数的函数转变为接收单一参数的函数
2.通过柯里化,允许用户自建控制结构,使得调用层次更加清晰
*/
object Demo {
println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet
def f1(a:Int,b:Int)={a+b} //> f1: (a: Int, b: Int)Int
//柯里化形式
def f11(a:Int)(b:Int)={a+b} //> f11: (a: Int)(b: Int)Int
f11(2)(3) //> res0: Int = 5
//练习1:根据f2,写出其等价的柯里化形式
def f2(a:Int,b:Int,c:Int)={a+b+c} //> f2: (a: Int, b: Int, c: Int)Int
def f21(a:Int)(b:Int)(c:Int)={a+b+c} //> f21: (a: Int)(b: Int)(c: Int)Int
def f22(a:Int,b:Int)(c:Int)={a+b+c} //> f22: (a: Int, b: Int)(c: Int)Int
def f23(a:Int)(b:Int,c:Int)={a+b+c} //> f23: (a: Int)(b: Int, c: Int)Int
def f3(a:Int,b:Int,f:(Int,Int)=>Int)={f(a,b)}
//> f3: (a: Int, b: Int, f: (Int, Int) => Int)Int
def f31(a:Int)(b:Int)(f:(Int,Int)=>Int)={f(a,b)}
//> f31: (a: Int)(b: Int)(f: (Int, Int) => Int)Int
def f32(a:Int)(b:Int,f:(Int,Int)=>Int)={f(a,b)}
//> f32: (a: Int)(b: Int, f: (Int, Int) => Int)Int
//留意这种形式:其中一组参数都是普通参数,另外一组参数是匿名函数
//这种形式称为自建的控制结构
def f33(a:Int,b:Int)(f:(Int,Int)=>Int)={f(a,b)}
//> f33: (a: Int, b: Int)(f: (Int, Int) => Int)Int
f33(2,3)(_+_) //> res1: Int = 5
f33(2,3)(_*_) //> res2: Int = 6
f33(2,3)((a,b)=>a+b) //> res3: Int = 5
}