ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Functional Programming
    RxSwift 2023. 2. 24. 21:44

    Functional Programming

    순수 함수를 이용해서 선언형으로 프로그래밍을 하는 방법 입니다.

    1. 데이터는 immutable하게 취급해야 한다.
    2. 데이터 변경이 필요할 때는 새로 만들자.
    3. Side-Effect이 없는 Pure Function을 사용하자.
    4. Function들의 Composition과 High-Order Function을 이용하자.

     

    Pure Function

    Pure Function 이란?

    • Pure Function은 특정 input에 대해서 항상 동일한 output을 반환하는 함수입니다.

    Pure Function의 특징

    1. Side-Effect이 없습니다.
    2. 외부의 값을 사용하지 않습니다.
    3. 외부의 값을 변경하지 않습니다.

    Pure Function 예시

    // non Pure Function
    var result = 0
    func sum(_ numbers: [Int]) -> Int {
        for number in numbers {
            result += number
        }
        return result
    }

    sum함수는 result의 값에 따라서 결과가 달라집니다.

    // Pure Function
    func sum(_ numbers: [Int]) -> Int {
        var result = 0
        for number in numbers {
            result += number
        }
        return result
    }

    sum함수는 같은 input에 항상 같은 output을 반환하며, 외부의 값을 사용 및 변경하지 않고 Side-Effect이 없는 Pure Function입니다.

     

    Higher-Order Function

    Higher-Order Function 이란?

    • 함수를 파라미터로 받거나 함수를 리턴하는 함수를 Higher-Order Function(고차함수)라고 합니다.

    Higher-Order Function 예시

    • filter, map, reduce 등등

     

    Function Composition

    Composition 이란?

    • 함수의 반환값을 다른 함수의 입력값으로 사용하는 기법 입니다.

    Composition 예시

    // non Composition
    func filterEven(_ numbers: [Int]) -> [Int] {
        numbers.filter { $0 % 2 == 0 }
    }
    
    func sum(_ numbers: [Int]) -> Int {
        numbers.reduce(0, +)
    }
    
    let numbers = Array(1...100)
    let filteredSumResult = sum(filterEven(numbers))
    // Composition
    func composefunction<A, B, C>(_ firstFunction: @escaping (A) -> B,
                                  _ secondFunction: @escaping (B) -> C) -> (A) -> C {
        return { x in
            return secondFunction(firstFunction(x))
        }
    }
    func filterEven(_ numbers: [Int]) -> [Int] {
        numbers.filter { $0 % 2 == 0 }
    }
    
    func sum(_ numbers: [Int]) -> Int {
        numbers.reduce(0, +)
    }
    
    let numbers = Array(1...100)
    let filteredSum = composefunction(filterEven, sum)
    let result = filteredSum(numbers)

     

    Function Currying

    Currying 이란?

    • 여러개의 파라미터를 받는 함수를 하나의 파라미터를 받는 함수로 쪼개는 기법 입니다.

    Currying을 하는 이유

    • 원활한 Composition을 하기 위해서는 함수의 Output과 Input의 타입과 개수가 같아야 합니다. 하지만 함수의 Output의 개수는 1개이기 때문에 Function의 Input을 1개로 만들게 되면 Function을 Composition하기 쉬워 집니다. 즉, Composition을 쉽게 하기 위해서 Currying을 하는 것 입니다.

    Currying 예시

    // non Currying
    func filterEven(between minimum: Int, and maximum: Int) -> [Int] {
        Array(minimum...maximum).filter { $0 % 2 == 0 }
    }
    // Currying
    func filterEven(between minimum: Int) -> (Int) -> [Int] {
        return { maximum in
            return Array(minimum...maximum).filter { $0 % 2 == 0 }
        }
    }

     

    참조

    Functional Reactive Programming 패러다임 - 곰튀김
    Functional Programming이 뭐하는 건가요? - 곰튀김
    Swift로 함수형 프로그래밍 시작하기 - 곰튀김

    'RxSwift' 카테고리의 다른 글

    RxSwift - 4.Hot Observable, Cold Observable  (0) 2023.03.03
    RxSwift - 3.Subjects  (0) 2023.03.02
    RxSwift - 2.Observable  (0) 2023.02.28
    RxSwift - 1.Reactive Programming, RxSwift 개념  (0) 2023.02.27
Designed by Tistory.