Scala

Scala의 함수 커링(Currying)과 표현

partner_jun 2017. 4. 14. 11:12


1. 기본

커링을 이용하면 파라미터가 여러개인 함수를 파라미터의 개수가 적거나 같은 새로운 함수로 만들 수 있다.

def plus(i: Int)(j: Int): Int = i + j
// plus 함수의 첫 번째 인자가 5인 새로운 함수를 선언한다.
val plusFive: (Int) => Int = plus(5)(_)

println(plusFive(10)) // 15


커링을 사용할 때 주의할 점은 첫 번째 파라미터가 아니라면 _에 타입을 명시해야 한다는 것이다. 타입 추론이 되지 않아 생기는 에러로 보인다.

  def plus(i: Int)(j: Int): Int = i + j

val plus1 = plus(10)(_) // 문제 없음.
// val plus2 = plus(_)(20) // _에서 에러 발생.
val plus3 = plus(_: Int)(20) // _에서 에러 발생.
println(plus3(50)) // 70


하나의 파라미터에서 필요한 값이 여러 개인 함수에서도 마찬가지다.

def multiply(i: Int, j: Int): Int = i * j
// val multiplyFive1 = multiply(5, _) // 에러
val multiplyFive = multiply(_: Int, 5)
println(multiplyFive(10)) // 50



2. 커링된 함수의 표현

커링된 함수도 =>를 이용해 파라미터를 순차적으로 입력하는 형태로 나타낼 수 있다.

def function1(i: Int)(j: Int)(z: Int) = i * j * z
val curriedFunction1: (Int) => (Int) => (Int) => Int = function1 _


언뜻 보기에는 거북하지만 수학에서 표현하는 함수를 생각하면 조금 편해진다.

((i) * j) * z)
(Int) => (Int) => (Int) => Int


이렇게 표현된 함수도 같은 방법으로 사용할 수 있다. 다만 함수가 연속적으로 호출 되는 형태이므로 하나의 파라미터가 여러 인자를 받는 것이 아니라, 파라미터의 개수가 많은 함수다.

val curriedFunction: String => String => String =  (s1) => (s2) => s1 + s2
println(curriedFunction("Hello")("World")) // HelloWorld