1。函数作为返回值
任意多参函数都可以柯里化,
a->b->c
可以理解为a->(b->c)
swift中(A,B)->C
可以转化为(A) ->( B -> C)
和(B) -> (A -> C)
一个函数可以经过简单的转化为三个函数
func add(a:Int,b:Int)->Int{
return a + b
}
add(3, b: 5)
func add1(a:Int)->Int->Int{
return { b in
return a + b
}
}
add1(3)(5)
func add3(a:Int)->Int->Int->Int{
return { b in
return { c in
return a + b + c
}
}
}
add3(3)(5)(6)
//14
add3(3)
//Int ->Int->Int
柯里化带来的好处是可以不全调用一个函数得到一个新的函数
未柯里化的函数要调用这个函数,要闭包才能调用,而柯里化直接就可以调用
[1,2,3,4,5,6].map(add1(3))
//[4, 5, 6, 7, 8, 9]
[1,2,3,4,5,6].map(add1(4))
//[5, 6, 7, 8, 9, 10]
[1,2,3,4,5,6].map { i in
add(i,b:3)
}
//[4, 5, 6, 7, 8, 9]
2。函数作为参数
函数是对于过程的抽象,函数作为参数就是对于函数的抽象
//数组中只留大于3的数 函数
func great3(arr:[Int])->[Int]{
var arr1 = [Int]()
for i in arr{
if i > 3{
arr1.append(i)
}
}
return arr1
}
//数组中只保留被2整除的函数
func mod2Equ0(arr:[Int])->[Int]{
var arr1 = [Int]()
for i in arr{
if i % 2 == 0{
arr1.append(i)
}
}
return arr1
}
//filter函数
func filter<A>(arr:[A],include: A -> Bool) -> [A]{
var arr1 = [A]()
for i in arr{
if include(i){
arr1.append(i)
}
}
return arr1
}