728x90

🍛 Ramda 세 번째 스텝: R.curry – 함수를 쪼개서 더 유연하게 쓰자

함수형 프로그래밍의 핵심 철학 중 하나는 작고, 순수하며, 조합 가능한 함수를 만드는 것입니다.
이때 중요한 역할을 하는 것이 바로 curry(커리)입니다.

Ramda에서는 R.curry를 통해 여러 인자를 받는 함수를, 하나씩 인자를 줄 수 있는 함수로 바꿔
함수 조합이나 재사용성을 극대화할 수 있습니다.


🧠 Topic Summary

R.curry: 다중 인자 함수를 하나씩 나눠서 받을 수 있게 만들어주는 도구

const add = (a, b) => a + b;
const curriedAdd = R.curry(add);

curriedAdd(1)(2); // 3
  • add(1, 2)와 같은 함수를 curriedAdd(1)(2)로 나눠서 호출 가능

  • 함수 조합에서 일부 인자만 미리 넣고 고정시킬 수 있음 (partial application)


🛠 Usage Examples

예제 1: 커리된 함수로 부분 적용(partial application) 하기

import * as R from 'ramda';

const multiply = (a, b) => a * b;
const curriedMultiply = R.curry(multiply);

const double = curriedMultiply(2);

double(5); // 10
double(10); // 20

설명: multiply를 커리화하여 double이라는 함수로 재사용하고 있습니다.

어떤 값이든 2배로 만드는 함수가 된 거죠.


예제 2: 리스트에서 특정 조건으로 필터링

const hasMinLength = R.curry((min, str) => str.length >= min);
const atLeast5Chars = hasMinLength(5);

R.filter(atLeast5Chars, ['hi', 'hello', 'world', 'js']); 
// ['hello', 'world']

설명: 커리된 함수에 min값을 먼저 고정하여, 나중에 문자열을 넣기만 하면 되는 새로운 함수를 만들었습니다.


예제 3: pipe와 함께 활용 (실전 조합)

const greet = R.curry((greeting, name) => `${greeting}, ${name}!`);

const excitedGreet = R.pipe(
  greet('Hello'),
  R.toUpper
);

excitedGreet('ramda'); // 'HELLO, RAMDA!'

설명: R.curry를 이용해 greeting만 먼저 설정하고, 이후에 이름만 넣는 방식으로 함수 조합을 깔끔하게 구성했습니다.


⚠️ Common Pitfalls

1. R.curry 는 함수만 커리화할 수 있다

R.curry(3); // ❌ 에러

2. 커리된 함수는 항상 인자를 다 받기 전까진 실행되지 않는다

const add3 = R.curry((a, b, c) => a + b + c);

add3(1)(2); // 아직 실행 안 됨
add3(1)(2)(3); // 실행됨: 6

3. this 를 사용하는 함수는 커리화에 주의해야 함

함수 내부에서 this를 사용하는 경우 R.curry와 호환되지 않을 수 있습니다. 대신 bind 또는 화살표 함수로 대체하거나 외부에서 context를 주입하는 방식이 필요합니다.


🔎 Advanced Tip:

R.partial vs R.curry

  • R.partial: 일부 인자를 고정한 새 함수 생성

  • R.curry: 여러 인자를 순차적으로 나눠 받을 수 있도록 만든 함수

const greet = (greeting, name) => `${greeting}, ${name}`;
const hello = R.partial(greet, ['Hello']); // Hello 고정
const hello2 = R.curry(greet)('Hello');    // 동일한 효과

둘 다 목적은 비슷하지만, R.curry는 pipe나 compose 같은 함수 조합에 더 잘 어울립니다.


✅ Call to Action

함수의 일부 인자만 먼저 넣어둘 수 있다면, 얼마나 다양한 곳에 재사용할 수 있을까요?

오늘은 R.curry를 통해 재사용성과 조합 가능한 함수를 만드는 연습을 해보세요.

실습 아이디어:

  • hasRole(role, user) → isAdmin = hasRole('admin')

  • formatDate(locale, date) → formatKoreanDate = formatDate('ko-KR')

728x90

+ Recent posts