1 post tagged

Composition

Композиция функций

В функциональном программировании часто используется построение функций, например построение функции f3 из двух функций f1 и f2 применив к ним функцию F, это и называется композицией функций. Расмотрим на простом примере. Создадим несколько функций, которые будут передаваться как параметры последовательно, первая функция создает и возвращает массив с работниками:

func createTeam(count: Int) -> [Employee] {
    var team = [Employee]()
    for i in 1...count {
        let f = i % 2 == 0
        team.append(Employee(id: i, pay: f ? i * 200 : i * 100, type: f ? .Dev : .QA))
    }
    return team
}

Вторая функция выбирает из масива только разработчиков и возвращает новый массив:

func getDevs(employees: [Employee]) -> [Employee] {
    return employees.filter({$0.type == .Dev})
}

И третья функция цепочки возвращает сумарную зарплату работников:

func getAverageSalary(employees: [Employee]) -> Int {
    return employees.reduce(0){$0 + $1.pay}
}

Осталось написать последнюю функцию, которая и будет композицией:

let salary = {count in getAverageSalary(getDevs(createTeam(count)))}

Теперь можно вызвать salary передав ей параметр count:

salary(5)

Также можно создать свой оператор для композиции, например >>> с левой асоциативностью (об кастомных операторах):

infix operator >>> { associativity left }
func >>> <A, B, C>(f: B -> C, g: A -> B) -> A -> C {
    return { x in f(g(x)) }
}

В итоге конструкция получится более изящной:

let salary2 = getAverageSalary >>> getDevs >>> createTeam
salary2(5)
2016   Composition   functional   Swift