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
'Scala' 카테고리의 다른 글
Scala, Map Collection의 withDefault, withDefaultValue 메소드 (0) | 2017.05.09 |
---|---|
Scala의 Future의 map, for, recover (0) | 2017.04.16 |
Scala Function Object의 메소드들 (0) | 2017.04.01 |
Java의 CompletableFuture, Scala의 Future와 Promise (0) | 2017.03.28 |
Scala의 암시(implicit) (1) | 2017.03.16 |