Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

sanichdaniel의 iOS 개발 블로그

Currying 본문

카테고리 없음

Currying

sanich8355 2020. 10. 14. 19:35

Currying

여러 인자를 받는 함수를 하나의 인자만 받는 함수들의 시퀀스로 변환하는 것입니다.

변환된 함수는 인자 하나를 받고, 값 대신 함수를 리턴한다. 이 리턴되는 함수는 다음 인자를 입력으로 받는다. 

예시 1

func add2(_ x: Int, _ y: Int) -> Int {
    return x + y
}
add2(1, 2) 

func add2Currying(_ x: Int) -> ((Int) -> Int) {
    return { y in
        return x + y
    }
}
add2Currying(1)(2) 

예시 2

func curry<A, B, C>(_ fn: @escaping (A, B) -> C) -> (A) -> (B) -> C {
    return { (a: A) in
        return { (b: B) in
            return fn(a, b)
        }
    }
}

enum LogLevel: String {
    case debug
    case error
}

func logMessage(level: LogLevel, message: String) {
    print("[\(level)] \(message)")
}

let logCurried = curry(logMessage)
let debug = logCurried(.debug)

debug("Log debug 1st")
debug("Log debug 2nd")
debug("Log debug 3rd")

 

사실 우린 알게 모르게 Currying을 쓰고 있었는데, 모든 인스턴스 메서드는 currying 된 타입 메서드다

NSColor.blueColor().shadowWithLevel(1/3)
// 아래처럼 변환 가능
NSColor.shadowWithLevel(NSColor.blueColor())(1/3)
class Adder  {
    func addOne(a: Int) -> Int {
        return a + 1
    }
}
let adder = Adder()

let addOne = Adder.addOne
let instanceMethod = addOne(adder)
print(instanceMethod(4))

 

커링의 장점

1. 함수의 재사용을 쉽게 만들어 줌 (인자 중 변하지 않는 값은 고정시키고 변하는 값만 지정해서 함수를 실행할 수 있게 해줌)

2. 여러 파라미터를 한번에 받지않고 부분적으로 받은 후 함수의 실행을 늦출 수 있다.

3. 인스턴스를 모르는 상황에서 인스턴스 메서드를 참조 가능하다

 

 

출처

jusung.github.io/Currying/

 

medium.com/@lazysoul/currying-%EC%BB%A4%EB%A7%81-b7af0b2aaef1