swift-高阶函数

Posted by sunzhongliang on January 7, 2021

高阶函数

高阶函数(Higher-order function), 必须满足下列一个条件的函数

  • 接收一个或多个函数作为输入
  • 输出一个函数

其实在函数式编程当中,到处都是高阶函数,经常要拿函数作为参数,或者是函数作为返回值

柯里化(Currying)

柯里化指的是将一个接收多参数的函数变换为一系列只接收单个参数的函数
比如我们调用一个add方法时,通常是这么调用的add(10, 20)但经过柯里化之后就变为这样调用add(10)(20)

// 普通方式
func add1(_ v1: Int, _ v2: Int) -> Int {
    return v1 + v2
}
// 柯里化方式
func add2(_ v1: Int) -> (Int) -> Int {
    return { $0 + v1 }
}

但假如要实现10+20+30呢,对应的柯里化实现就有点复杂了

// add3(30)(20)(10)
func add3(_ v3: Int) -> (Int) -> (Int) -> Int {
    // a == 20
    return { v2 in
        // b == 10
        return { v1 in
            return v1 + v2 + v3;
        }
    }
}

以上,是实现了add3(30)(20)(10)柯里化方式,但如果用泛型来实现的话就是这样:

func add1(_ v1: Int, _ v2: Int) -> Int {
    return v1 + v2
}
// 传任何一个接收两个参数的方法, 自动转换柯里化版本
func currying<A, B, C>(_ fn: @escaping (A, B) -> C) -> (B) -> (A) -> C {
    return { b in
        return { a in
            return fn(a, b)
        }
    }
}
// 测试入口
func test() {
    // currying方法,将add1方法转换为柯里化,然后在去调用传入参数
    print(currying(add1)(10)(20));
}

通过currying方法,可以将传统的方法转为柯里化的版本

本文首次发布于 孙忠良 Blog, 作者 [@sunzhongliang] , 转载请保留原文链接.