sanichdaniel의 iOS 개발 블로그
Currying 본문
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. 인스턴스를 모르는 상황에서 인스턴스 메서드를 참조 가능하다
출처
medium.com/@lazysoul/currying-%EC%BB%A4%EB%A7%81-b7af0b2aaef1