[JS] Currying

Lian Kim·2022년 9월 1일
0

클로저에 대해 공부하다가 여러번 중첩된 화살표 함수를 보게 되었다. 어떻게 동작하는지 알아보던 중에 currying이라는 용어를 접하게 되었는데 너무 생소하다! 도대체 currying이 뭘까?

함수형 프로그래밍에서의 커링(currying)은 여러 인수를 받는 함수를 각각 하나의 인수만 받는 함수로 변환하여 체이닝하는 기술로, 쉽게 말하자면 함수를 반환하는 함수이다.

예를 들어, 세 개의 인수를 가지는 함수 f를 커링(currying)하면 세 개의 함수가 생성된다.



커링 이해하기

const add = x => y => x + y;

위의 화살표 함수를 일반 함수로 바꿔서 작성해보면 아래와 같다.

const add = function (x) {
  return function (y) {
    return x + y;
  }
}

일반 함수로 보니 명확하게 add가 function (y) { return x + y; }를 반환하는 함수라는 것을 알 수 있다.

화살표 함수로 다시 돌아가서 보면 결국 add는 (y => x + y)를 반환하는 함수인 것이다.

const add = x => (y => x + y)

함수가 필요로 하는 인수를 모두 전달받기 전까지는 함수를 반환하고, 필요로 하는 인수를 모두 전달받았을 때 비로소 값을 반환한다.
add(2) // -> (y => 2 + y)
add(2)(3) // -> 5

필요한 경우 둘 이상의 화살표 함수도 시퀀싱 할 수 있다.

const three = a => b => c => a + b + c
const four = a => b => c => d => a + b + c + d

three(1)(2)(3) // -> 6
four(1)(2)(3)(4) // -> 10



커링을 사용하는 이유

  • 함수의 재활용
  • 함수의 확장 용이

Example 1

const three = (a, b, c) => a + b + c;

three(1, 2, 3) // 6
three(1, 4, 9); // 14
three(1, 10, 100) // 111
const three = a => b => c => a + b + c;
const firstArg = three(1);

firstArg(2)(3)
firstArg(4)(9)
firstArg(10)(100)

Example 2

const sentence =
    greeting => seperator =>  end => name =>
        console.log(greeting + seperator + name + end);

const introduce = sentence('안녕하세요')('. ')('입니다.');
introduce('리안'); // 안녕하세요. 리안입니다.
introduce('대표'); // 안녕하세요. 대표입니다.

const sayHi = sentence('안녕하세요')(', ')('님.');
greet('리안'); // 안녕하세요. 리안님.
greet('대표'); // 안녕하세요. 대표님.

const sayBye = sentence('안녕히가세요')(', ')('님.');
bye('리안'); // 안녕히가세요, 리안님.
bye('대표'); // 안녕히가세요, 대표님.



참고 자료
wikipedia Currying
여러 개의 화살표 함수
커링 (Currying)

0개의 댓글