ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Scala Currying(커링)
    Scala 2014. 6. 11. 09:00
    반응형

    Currying : 인자가 여러개 있는 함수를 하나의 인자를 가진 함수의 체인형태로 만들어 주는 것.

    f:(X*Y) -> Z 형식의 함수가 있을때 이것을 currying하면 curry(f): X -> (Y - > Z) 형태로 만듬.

    예) 
    f(x, y) = y/x 의 원본함수가 있다고 했을때
    f(2, 3)의 값을 계산하려고 한다면
    우선 2를 x에 대입함. 그렇게 되면 함수는 f(2, y) = y / 2  의 형태가 됨. 이때 f(2, y)를 g(y)라는 새로운 함수라고 볼 수 있음.
    결국 g(y) = f(2, y) = y/2 라고 볼 수 있음.
    이 g(y)의 y에 3을 입력하면 g(3)이 되고, g(3)는 g(3) = f(2, 3) = 3/2 이런형식이 되는걸 알 수 있음.

    코드예)
    아래 코드에서 보면 modN(2), modN(3)에 쓰이는 modN은 원래 Int형 변수를 2개 받는 함수이지만
    currying을 통해서 우선 n에 해당하는 값을 입력받은 다음에, 나중에 finter 함수의 p(xs.head) 부분에서 x에 해당하는 부분을 입력받게 됨.

    object Test{
    
      def filter(xs: List[Int], p: Int => Boolean): List[Int] =
        if (xs.isEmpty) xs
        else if (p(xs.head)) xs.head :: filter(xs.tail, p)
        else filter(xs.tail, p)                       //]] > filter: (xs: List[Int], p: Int => Boolean)List[Int]
     
      def modN(n: Int)(x: Int) = ((x % n) == 0)       //]] > modN: (n: Int)(x: Int)Boolean
     
      val nums = List(1, 2, 3, 4, 5, 6, 7, 8)         //]] > nums  : List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)
      println(filter(nums, modN(2)))                  //]] > List(2, 4, 6, 8)
      println(filter(nums, modN(3)))                  //]] > List(3, 6)
    
    }
    


    반응형

    'Scala' 카테고리의 다른 글

    Scala Pattern Matching(패턴매칭)  (0) 2014.06.13
    Scala Traits(트레잇)  (0) 2014.06.06
    Scala Class, Object(클래스, 오브젝트)  (0) 2014.06.02
    Scala 함수  (0) 2014.05.30
    Scala 루프구문  (0) 2014.05.28

    댓글

Designed by Tistory.