函数式编程swift实例

134 阅读1分钟
// 实现:[(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)