// 커링과 언커링
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a: A => b: B => f(a: A, b: B)
def uncurry[A,B,C](f: A => B => C): (A, B) => C =
(a, b) => f(a)(b)
// 언커링 커링 sum 예시
val sum: (Int, Int) => Int = (x, y) => x + y
val curriedSum: Int => Int => Int = x => y => x + y
// 스칼라에서는 여러인수를 허용 하기 때문에 아래처럼도 할수 있다.
def sum(x: Int, y: Int): Int = x + y
def curriedSum(x: Int)(y: Int): Int = x + y
// 사용할때 이점
val numbers: List[Int] = List(1, 2, 3)
numbers.map(n => sum(1, n)) shouldBe List(2, 3, 4)
numbers.map(curriedSum(1)) shouldBe List(2, 3, 4)