이번 스칼라 스터디 내용에 currying이 있었으며
지난 번에는 partially applied function이 있었는데 볼 때마다 헤매게 되어 조금 정리해볼까 한다.
1. currying
지난 번에는 partially applied function이 있었는데 볼 때마다 헤매게 되어 조금 정리해볼까 한다.
1. currying
스칼라에서 커링은, 여러 개의 파라미터를 받는 함수를 파라미터 리스트를 받는 함수로 바꾸어준다.
scala> def justFun(a:Int, b:Int){ | val sum = a + b | println("result : " + sum) | } justFun: (a: Int, b: Int)Unit
scala> def curriedFun(a:Int)(b:Int){ | val sum = a + b | println("result : " + sum) | } curriedFun: (a: Int)(b: Int)Unit
그런데 커링을 단순히 함수의 변형으로만 보면 안되는게
커리된 함수를 호출했을 때 파라미터가 전달되는 모습을 내부적으로 보 면 알 수 있다.
함수에 첫번째 인자를 넘기면 그 결과로 두번째 인자를 받는 함수가 반환이 되고
반환된 함수에 두번째 인자를 넘기면 기존-커리되지 않은 함수-의 결과가 반환된다.
이를 수학적으로 표현하게 되면, A(x,y)→z 인 함수를 C'A(x)(y)→z 로 바꾸는 걸로 볼 수 있다.
클로저(closures)를 지원하는 언어에서는 커리된 함수를 쓸 수 있다고 한다.
2. partially applied function
일반적으로 여러개의 파라미터를 받는 함수에 모든 파라미터를 넘기면 fully applied 라고 하며
파라미터의 일부만 넘기면 이를 partially applied 라고 한다.
그리고 이때 파라미터는 _(underscore)가 대신한다.
참고) http://en.wikipedia.org/wiki/Currying
커리된 함수를 호출했을 때 파라미터가 전달되는 모습을 내부적으로 보 면 알 수 있다.
scala> justFun(3,4) result : 7실제로 수행되는 내역을 보면 위와 같다.
scala> curriedFun{3}{4} result : 7 scala> val one = curriedFun(3)_ one: Int => Unit = <function1>scala> one(4) result : 7
함수에 첫번째 인자를 넘기면 그 결과로 두번째 인자를 받는 함수가 반환이 되고
반환된 함수에 두번째 인자를 넘기면 기존-커리되지 않은 함수-의 결과가 반환된다.
이를 수학적으로 표현하게 되면, A(x,y)→z 인 함수를 C'A(x)(y)→z 로 바꾸는 걸로 볼 수 있다.
클로저(closures)를 지원하는 언어에서는 커리된 함수를 쓸 수 있다고 한다.
2. partially applied function
일반적으로 여러개의 파라미터를 받는 함수에 모든 파라미터를 넘기면 fully applied 라고 하며
파라미터의 일부만 넘기면 이를 partially applied 라고 한다.
그리고 이때 파라미터는 _(underscore)가 대신한다.
scala> def fully(a:Int, b:Int, c:Int){ | val sum = a + b + c | println("sum : " + sum) | } fully: (a: Int, b: Int, c: Int)Unit scala> fully(1,2,3) sum : 6 scala> val partially = fully _ partially: (Int, Int, Int) => Unit = <function3>scala> partially(1,2,3) sum : 6
참고) http://en.wikipedia.org/wiki/Currying
Posted by zeide