// 实现:[(num + 3) * 5 - 1] % 10 / 2
let num = 1
func add(_ v: Int) -> (Int) -> Int {
{ $0 + v } // 只有单行代码可省return
}
func sub(_ v: Int) -> (Int) -> Int {
{ $0 - v }
}
func multiple(_ v: Int) -> (Int) -> Int {
{ $0 * v }
}
func divide(_ v: Int) -> (Int) -> Int {
{ $0 / v }
}
func mod(_ v: Int) -> (Int) -> Int {
{ $0 % v }
}
// 函数合成
infix operator >>> : AdditionPrecedence
// 函数作为参数, 返回一个函数
func >>><A, B, C>(_ f1: @escaping (A) -> B, _ f2: @escaping (B) -> C) -> (A) -> C {
{ f2(f1($0)) }
}
let fn = add(3) >>> multiple(5) >>> sub(1) >>> mod(10) >>> divide(2)
// num传递给f1函数,f1返回Int结果给f2,f2返回
let result = fn(num)
// 柯里化函数
prefix func ~<A, B, C>(_ fn: @escaping (A, B) -> C) -> (B) -> (A) -> C {
return { b in
return { a in
return fn(a, b)
}
}
}
(~add)(20)(10)
高阶函数: 将函数作为参数 柯里化函数(currying):将一个接收多个参数的函数变为接收单个参数的多个函数
//柯里化函数
func add(_ v3: Int) -> (Int) -> (Int) -> Int {
return { v2 in
return { v1 in
return v1 + v2 + v3
}
}
}
add(30)(20)(10)