'커리'에 해당되는 글 1건

  1. 2011.10.15 [Scala] currying 과 partially applied function
이번 스칼라 스터디 내용에 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
그런데 커링을 단순히 함수의 변형으로만 보면 안되는게
커리된 함수를 호출했을 때 파라미터가 전달되는 모습을 내부적으로 보 면 알 수 있다.
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
,