🛠️ 처음부터 만드는 Curry — 함수의 인자를 부분 적용하기
# Curry란?
여러 개의 인자를 받는 함수를 하나의 인자씩만 받는 함수 연쇄로 변환합니다. 부분 적용(partial application)을 가능하게 해서 함수를 더 유연하게 만들어요.
```javascript
// 일반 함수
const add = (a, b, c) => a + b + c;
add(1, 2, 3); // 6
// 커링된 함수
const curriedAdd = curry(add);
const add1 = curriedAdd(1); // 함수 반환
const add1and2 = add1(2); // 함수 반환
const result = add1and2(3); // 6 반환
// 또는 한 번에
curriedAdd(1)(2)(3); // 6
```
```javascript
function curry(fn) {
const arity = fn.length; // 함수가 받는 인자 개수
return function curried(...args) {
if (args.length >= arity) {
// 충분한 인자가 모이면 원래 함수 실행
return fn(...args);
}
// 아직 인자가 부족하면 남은 인자를 받을 함수 반환
return (...nextArgs) => curried(...args, ...nextArgs);
};
}
```
```javascript
const multiply = (a, b) => a * b;
const curriedMultiply = curry(multiply);
// 배열 변환에 재사용
const double = curriedMultiply(2);
const numbers = [1, 2, 3, 4];
numbers.map(double); // [2, 4, 6, 8]
// 필터링
const isGreaterThan = curry((min, n) => n > min);
const isGreaterThan10 = isGreaterThan(10);
numbers.filter(isGreaterThan10); // [11, 12, ...]
```
커링은 Pipe, Compose와 함께 사용하면 함수형 프로그래밍의 진가를 느낄 수 있습니다. 부분 적용으로 특정 값이 고정된 함수를 만들어 재사용성을 극대화할 수 있어요.
📚 참고: [JavaScript 함수형 프로그래밍](https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function)
여러 개의 인자를 받는 함수를 하나의 인자씩만 받는 함수 연쇄로 변환합니다. 부분 적용(partial application)을 가능하게 해서 함수를 더 유연하게 만들어요.
```javascript
// 일반 함수
const add = (a, b, c) => a + b + c;
add(1, 2, 3); // 6
// 커링된 함수
const curriedAdd = curry(add);
const add1 = curriedAdd(1); // 함수 반환
const add1and2 = add1(2); // 함수 반환
const result = add1and2(3); // 6 반환
// 또는 한 번에
curriedAdd(1)(2)(3); // 6
```
구현
```javascript
function curry(fn) {
const arity = fn.length; // 함수가 받는 인자 개수
return function curried(...args) {
if (args.length >= arity) {
// 충분한 인자가 모이면 원래 함수 실행
return fn(...args);
}
// 아직 인자가 부족하면 남은 인자를 받을 함수 반환
return (...nextArgs) => curried(...args, ...nextArgs);
};
}
```
실제 활용
```javascript
const multiply = (a, b) => a * b;
const curriedMultiply = curry(multiply);
// 배열 변환에 재사용
const double = curriedMultiply(2);
const numbers = [1, 2, 3, 4];
numbers.map(double); // [2, 4, 6, 8]
// 필터링
const isGreaterThan = curry((min, n) => n > min);
const isGreaterThan10 = isGreaterThan(10);
numbers.filter(isGreaterThan10); // [11, 12, ...]
```
커링은 Pipe, Compose와 함께 사용하면 함수형 프로그래밍의 진가를 느낄 수 있습니다. 부분 적용으로 특정 값이 고정된 함수를 만들어 재사용성을 극대화할 수 있어요.
📚 참고: [JavaScript 함수형 프로그래밍](https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function)
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!