함수형 프로그래밍에 대해서 공부해보면 꼭 나오는 용어들이 있다. 일급 시민, 함수 합성, 커링 등. 오늘은 이러한 단어들에 대해서 이해해보자.
func outer() {
var x = 1
func inner() { // nested function
x += 1 // non-local variable
print(x)
}
return inner // function return 가능
}
import Foundation
func guguStringFormat(left: Int, right: Int, expressFormat: String) -> String {
return String(format: expressFormat, left, right, (left * right))
}
func gugustringGenerator(left: Int, expressFormat: String) -> (Int) -> String {
return { (right: Int) -> String in
guguStringFormat(left: left, right: right, expressFormat: expressFormat)
}
}
let generator3 = gugustringGenerator(left: 3, expressFormat: "%d x %d = %d")
let result3 = (1...9).map(generator3)
print(result3.joined(separator: "\n"))
여러개의 argument를 받는 function을 단일 argument를 받는 function chain으로 변형
실제로 만들어서 generic으로 사용하려면 참 머리아프다.
currying opensource 있으니 사용해보자.
예시
func f(a: Int, b: Int) -> Int {
return a + b
}
func g(a: Int) -> (Int) -> Int {
return { (b: Int) -> Int in
return a + b
}
}
print(f(a: 3, b: 4))
print(g(a: 3)(4))
활용도
두번째 argument 활용을 지연할 수 있다. 유연함을 제공
func add(a: Int, b: Int) -> Int {
return a + b
}
func curriedAdd(a: Int) -> (Int) -> Int {
return { (b: Int) -> Int in
return a + b
}
}
let curriedAdd3 = curriedAdd(a: 3)
let result = [2, 4, 7].map(curriedAdd3)
print(result) // 5 7 10
Factory for functions
묵시적인 값