🍛 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); // 실행됨: 63. 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')
'JAVASCRIPT > Ramda' 카테고리의 다른 글
| [Ramda] 객체 다루기 – `R.prop`, `R.path`, `R.assoc`, `R.evolve` (0) | 2025.05.27 |
|---|---|
| [Ramda] R.map, R.filter, R.reduce로 배열을 함수형 스타일로 다루기 (0) | 2025.05.26 |
| [Ramda] Doc, 함수 목록 (0) | 2025.05.23 |
| [Ramda] R.compose (0) | 2025.05.22 |
| [Ramda] R.pipe (1) | 2025.05.22 |