본문 바로가기
Programming Paradigm/Functional Programming

함수형 프로그래밍 : 합성 (Composition)

by 탄이. 2020. 1. 25.

함수의 반환값이 다른 함수의 입력값으로 사용되는 것

func f1(_ i: Int) -> Int {
    return i * 2
}

func f2(_ i: Int) -> String {
    return "\(i)"
}

let result = f2(f1(100))

/// 1급개체로서의  함수를 합성하는 예제
func ff(_ pf1: @escaping (Int) -> Int, _ pf2: @escaping (Int) -> String) -> (Int) -> String {
    return { i in // i == 100
        // 100 -> 200 -> "200"
        return pf2(pf1(i))
    }
}

let f3 = ff(f1, f2)
let result2 = f3(100) // 합성된 함수를 한번에 사용

/// generic을 사용해서 합성함수를 생성하는 범용적인 함수를 만들 수 있습니다.
func comp<A, B, C>(_ pf1: @escaping (A) -> B, _ pf2: @escaping (B) -> C) -> (A) -> C {
    return { i in
        return pf2(pf1(i))
    }
}

// 실습
// 짝수 만의 합을 계산하는 코드를 함수의 합성을 이용하여 완성하세요.
func comp2<A, B, C>(_ pf1: @escaping (A) -> B,
                   _ pf2: @escaping (B) -> C) -> (A) -> C {
    return { i in
        return pf2(pf1(i))
    }
}

func filterEven(_ ns: [Int]) -> [Int] {
    //함수를 구현하세요
    return ns.filter { $0 % 2 == 0 }
}

func sum(_ ns: [Int]) -> Int {
    //함수를 구현하세요
    return ns.reduce(0, +)
}

let filteredSum = comp(filterEven, sum)

func solution(_ nums: [Int]) -> Int {
    return filteredSum(nums)
}

let f4 = comp(f1, f2)

댓글