"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 자바스크립트 커링

자바스크립트 커링

2024-08-07에 게시됨
검색:147

JavaScript Currying

커링은 여러 인수가 있는 함수를 각각 단일 인수를 사용하는 일련의 함수로 변환하는 함수형 프로그래밍의 강력한 개념입니다. 이 기술을 사용하면 더 모듈화되고 재사용 가능한 코드가 가능해집니다. JavaScript에서는 커링을 다양한 방식으로 구현할 수 있습니다. 이 블로그에서는 커링을 살펴보고, 예제를 제공하고, n 인수 커링을 달성하기 위한 다양한 방법에 대해 논의합니다.

커링이란 무엇입니까?

커링은 여러 인수를 취하는 함수를 각각 단일 인수를 취하는 일련의 함수로 변환하는 프로세스입니다. 예를 들어 함수 f(a, b, c)는 f(a)(b)(c)로 변환될 수 있습니다.

왜 커링을 사용하는가?

  • 부분 적용: 커링을 사용하면 함수의 일부 인수를 수정하고 새 함수를 만들 수 있습니다.
  • 고차 함수: 다른 함수를 인수로 사용하거나 반환하는 고차 함수의 사용을 용이하게 합니다.
  • 코드 재사용성: 커리된 함수의 재사용성과 구성성이 더욱 높아졌습니다.
  • 함수적 구성: Currying은 더 나은 기능적 구성을 가능하게 합니다. 즉, 더 간단한 기능을 결합하여 복잡한 기능을 구축하여 더 깨끗하고 유지 관리하기 쉬운 코드를 만듭니다.

간단한 커링 예제

카링이 어떻게 작동하는지 이해하기 위해 기본적인 예부터 시작해 보겠습니다.

커리되지 않은 기능

다음은 세 개의 숫자를 추가하는 간단한 함수입니다.

function add(a, b, c) {
  return a   b   c;
}

console.log(add(1, 2, 3)); // Output: 6

설명: 이 함수 add는 세 개의 인수 a, b, c를 취하고 그 합계를 반환합니다. add(1, 2, 3)을 호출하면 6이 반환됩니다.


카레 기능

이제 이 함수를 카레 버전으로 변환해 보겠습니다.

function curryAdd(a) {
  return function(b) {
    return function(c) {
      return a   b   c;
    };
  };
}

console.log(curryAdd(1)(2)(3)); // Output: 6

설명: curryAdd 함수는 인수 a를 취하고 인수 b를 취하는 함수를 반환하며, 이는 차례로 인수 c를 취하는 함수를 반환합니다. 마지막 함수는 a, b, c의 합을 반환합니다. curryAdd(1)(2)(3)을 호출하면 중첩된 함수를 통해 인수 1, 2, 3을 순차적으로 전달하여 6.

가 됩니다.

화살표 함수를 사용한 커링

자바스크립트의 화살표 함수는 카레 함수를 생성하는 간결한 방법을 제공합니다.

const curryAddArrow = a => b => c => a   b   c;

console.log(curryAddArrow(1)(2)(3)); // Output: 6

설명: curryAddArrow 함수는 인수 a를 취하고 b를 취하는 또 다른 화살표 함수를 반환하는 화살표 함수입니다. 이는 c를 취하는 또 다른 화살표 함수를 반환합니다. 마지막 화살표 함수는 a, b, c의 합을 반환합니다. curryAddArrow(1)(2)(3)을 호출하면 중첩된 화살표 함수를 통해 인수 1, 2, 3을 순차적으로 전달하여 6.

가 생성됩니다.

사용 사례

1. 구성 기능

커링의 일반적인 사용 사례는 구성 기능입니다. 예를 들어, 로깅 수준과 메시지 형식을 별도로 구성하려는 로깅 유틸리티를 생성한다고 가정해 보십시오.

function logger(level) {
  return function (message) {
    console.log(`[${level}] ${message}`);
  };
}

const infoLogger = logger('INFO');
const errorLogger = logger('ERROR');

infoLogger('This is an info message');
errorLogger('This is an error message');

2. 문자열 포맷터

커링을 사용하여 문자열 포맷터를 생성할 수 있는 실제 예를 고려해 보겠습니다. 이 포맷터를 사용하면 접두사와 접미사를 별도로 구성할 수 있습니다.

function formatter(prefix) {
  return function (suffix) {
    return function (str) {
      return `${prefix}${str}${suffix}`;
    };
  };
}

const htmlFormatter = formatter('')('');
console.log(htmlFormatter('Hello')); // Hello

const parensFormatter = formatter('(')(')');
console.log(parensFormatter('123')); // (123)

최신 JavaScript 라이브러리의 커링

Currying은 Lodash 및 Ramda와 같은 최신 JavaScript 라이브러리에서 일반적으로 사용됩니다. 예를 들어 Lodash에서는 _.curry 메소드를 사용하여 카레 함수를 쉽게 만들 수 있습니다.

const _ = require('lodash');

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = _.curry(multiply);

console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24

N개의 인수를 사용한 커링

n개의 인수를 추가하는 재귀 함수를 사용하여 커링하는 예제를 아래에서 살펴보겠습니다. 우리는 커링을 사용하여 한 번에 하나씩 원하는 수의 인수를 허용하고 함께 추가할 수 있는 함수를 만들 것입니다.

function curryAddition(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function(...nextArgs) {
        return curried(...args, ...nextArgs);
      };
    }
  };
}

// This function sums an array of numbers
function add(...nums) {
  return nums.reduce((acc, num) => acc   num, 0);
}

// Creating a curried version of the addition function
const curriedAdd = curryAddition(add);

// Function to handle n arguments
function curriedAddN(...initialArgs) {
  function adder(...args) {
    if (args.length === 0) {
      return curriedAdd(...initialArgs);
    }
    initialArgs.push(...args);
    return adder;
  }
  return adder;
}

// Examples
const addFiveNumbers = curriedAddN();
console.log(addFiveNumbers(1)(2)(3)(4)(5)()); // 15

const addThreeNumbers = curriedAddN(1)(2)(3);
console.log(addThreeNumbers()); // 6

const addNumbersInSteps = curriedAddN(1, 2)(3)(4, 5);
console.log(addNumbersInSteps()); // 15

결론

커링은 코드의 모듈성과 재사용성을 향상시키는 함수형 프로그래밍의 강력한 기술입니다. 함수를 단일 인수 함수의 체인으로 변환함으로써 커링은 부분 적용과 유연한 함수 구성을 허용합니다. 구성, 문자열 형식화 또는 복잡한 계산 등 어떤 경우에도 커링을 사용하면 코드를 더욱 표현력 있고 적응력 있게 만들 수 있습니다.

릴리스 선언문 이 글은 https://dev.to/rahulvijayvergiya/javascript-currying-op2?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3