본문 바로가기
Programming Paradigm/Functional Programming

커링 (Currying)

by 탄이. 2020. 6. 16.
  • 20세기 수학자인 Haskell Curry 등의 작업으로 수학에서 유래한 언어 기술
  • 여러개의 파라미터를 받는 함수를 하나의 파라미터를 받는 여러 개의 함수로 쪼개는 것
func multiply(_ a: Int) -> (Int) -> Int {
    return { b in
        return a * b
    }
}

let area = multiply(10)(20) //200

커링을 하는 이유

  • 함수의 합성을 원활하게 하기 위해서 입니다.
  • 함수의 Output이 다른 함수의 Input으로 연결되면서 합성될 때
  • 함수들이 서로 chain을 이루면서 연속적으로 연결이 되려면, Output과 Input의 타입과 갯수가 같아야 합니다.
  • 함수의 Output은 하나밖에 없으니 Input 또한 모두 하나 씩만 갖도록 한다면 합성하기가 쉬워질 것입니다.

실습

n의 배수만을 모아 합을 구하는 함수 filterSum를 currying 하시오.

func filterSum(_ ns: [Int], _ n: Int) -> Int {
    return ns.filter({ $0 % n == 0 }).reduce(0, +)
}

func filterSum2(_ n: Int) -> ([Int]) -> Int {
    //함수를 구현하세요
    return { b in
        return b.filter({$0 % n == 0}).reduce(0, +)
    }
}

func solution(_ nums: [Int], _ r: Int) -> Int {
    let filteredR: ([Int]) -> Int = filterSum2(r)
    return filteredR(nums)
}

댓글