Swift-函数式编程
2023-03-16 本文已影响0人
Sweet丶
函数式编程是一种编程范式,一个方法论。
其主要思想: 把计算过程尽量分解成一系列可复用函数的调用。
主要特征: 函数是“第一等公民”,也就是函数与其他数据类型一样,可以赋值给其他变量,作为函数参数或者返回值。
1. 柯里化(currying)
高阶函数:接收一个或多个函数作为输入;或者返回一个函数。
柯里化:将一个接收多个参数的函数变换为一系列只接收单个参数的函数的过程。
柯里化例子:将传3个参数的函数变为连续传参的函数
func add_tobeCurrying(v1: Int, v2: Int, v3: Int) -> Int { v1 + v2 + v3 }
// 将带三个参数的函数进行柯里化
prefix func ~<A, B, C, D>(_ fn: @escaping (A, B, C) -> D) -> (C) -> (B) -> (A) -> D {
{c in { b in { a in fn(a, b, c) } } }
}
func testCurrying() {
print((~add_tobeCurrying)(10)(20)(30))
}
2. 函子(Factor)
像Array、Optional这样支持map运算的类型,称为函子。
3. 适用函子(Applicative Functor)
对于任意一个函子F,如果能支持以下运算,那么该函子就是适用函子。
func pure<T>(_ value: T) -> F<T>
func <*><A, B>(fn: F<(A) -> B>, value: F<A>) ->F<B>
Array、Optional是适用函子:
// T是一个函子类型
func pure<T>(_ value: T) -> T? {
return T
}
infix operator <*> : AdditionPrecedence
func <*><A, B>(fn: ((A) -> B)?, value: A?) -> B? {
guard let f = fn, let v = value else{
return nil
}
return f(v)
}
var number: Int? = 10
var fn: ((Int) -> Int)? = { $0 * 5 }
pure(number)// 这里是Optional(10)
fn <*> number// 这里在<*>中缀运算符计算后,得到的结果是Optional(50)
4. 单子(Monad)
对于任意一个类型F,如果支持以下操作就被称为单子。
func pure<T>(_ value: T) -> F<T>
func flatMap<A, B>(_ value: F<A>, _ fn: (A) -> F<B>) -> F<B>
可选类型、数组显然符合这两个条件。
数组、Optional也是符合的,可见Swift语言为函数式编程是做了支持的,而在OC中,函数式编程集成了ReactiveObjc库之后才有这些高阶函数,才算是支持。