검색결과 리스트
curried function에 해당되는 글 1건
- 2015.11.25 [swift2] Currying 함수
글
[swift2] Currying 함수
수학과 컴퓨터 과학에서, Currying은 여러 인자를 취하는 함수를 일련의 단일 인자를 받는 함수들로 변환하는 테크닉을 의미합니다.
두 개의 인자를 받고 그 합을 반환하는 함수를 정의해보겠습니다. 대부분 개발자들에게 익숙한 형태는 다음과 같습니다.
func add1(x:Int, y:Int) -> Int {
return x + y
}
add1 함수는 2개의 정수를 받아 그 합을 반환합니다.
Swift 에서는 결과는 동일하지만 다른 형태의 함수를 다음과 같이 정의할 수 있습니다.
func add2(x:Int) -> (Int -> Int) {
return { y in return x + y }
}
add2 함수는 한개의 인자를 받고, 두번째 인자를 필요로 하는 클로저를 반환합니다. add2는 add1과는 다른 형태로 호출됩니다.
add1(1, 2)
add2(1)(2)
return 문을 생략하고 다음 형태로도 정의 할 수 있습니다.
func add3(x:Int) -> (Int -> Int) {
return { y in x + y }
}
함수 화살표(->) 는 오른쪽으로 연관을 짓기 때문에, A -> B -> C는 A -> (B-> C)라고 읽을 수 있습니다. (즉 A 인자를 받고, B->C 타입의 함수를 반환하는 함수)
위와 같이 여러 인자를 요구하는 함수를 하나의 인자를 받는 함수를 연쇄적으로 호출하는 방식으로 변환하는 과정을 논리학자 Haskell Curry 에서 유래하여 currying 이라고 합니다.
add2는 add1의 curried 버전이라고 합니다. Swift에서 curry 함수를 정의할수 있는 세 번째 방법이 있습니다.
func add4(x:Int)(_ y:Int) -> Int {
return x + y
}
add4(1)(2)
currying의 흥미로운 점은 다른 함수에 인자로 함수를 넘겨야 경우에 알수 있습니다. add1 같은 uncurried 함수만 정의했다면 함수에 두개의 파라미터를 전달해야합니다. 반면 add2와 같이 curried 함수들에서는 한개의 파라미터 또는 두 개의 파라미터를 전달할지 선택할 수 있습니다.
// 2개의 파라미터를 전달하여 즉시 결과를 얻는다.
var result = add4(0)(4)
// 4
// 1개의 파리미터를 전달하고, 결과함수를 보관하여 재활용한다.
var addFour = add4(4)
var array = [1, 2, 3, 4, 5, 6]
var addedArray = array.map { addFour($0) }
// [5, 6, 7, 8, 9, 10]
'Swift' 카테고리의 다른 글
| [swift2.1] Swift 프로토콜 지향 프로그래밍 2 (0) | 2015.12.09 |
|---|---|
| [swift2] 키워드로 보는 Swift (0) | 2015.11.30 |
| [swift2] Currying 함수 (0) | 2015.11.25 |
| [swift2] Core Image Filter 예제 (0) | 2015.11.10 |
| [swift2.1] Xcode7.1 Playground 변경사항 (0) | 2015.10.27 |
| [swift2] Functor 와 Monad (0) | 2015.10.25 |