기능적 JavaScript — 커링

https://www.amazon.com/John-Au-Yeung/e/B08FT5NT62에서 Amazon에서 내 책을 확인하십시오.

지금 http://jauyeung.net/subscribe/에서 내 이메일 목록을 구독하십시오.

JavaScript는 부분적으로 함수형 언어입니다.

JavaScript를 배우려면 JavaScript의 기능적인 부분을 배워야 합니다.

이 기사에서는 JavaScript로 커링을 사용하는 방법을 살펴보겠습니다.

단항 함수



단항 함수는 단일 인수를 취하는 함수입니다.

예를 들어, 단항 함수는 다음과 같습니다.

const identity = (x) => x;


이진 함수



이진 함수는 2개의 인수를 취하는 함수입니다.

하나의 예는 다음과 같습니다.

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


가변 함수



가변 함수는 가변 개수의 인수를 취하는 함수입니다.

나머지 연산자를 사용하여 JavaScript에서 가변 함수를 정의할 수 있습니다.

function variadic(...args) {
  console.log(args)
}

args에는 우리가 전달하는 모든 인수의 배열이 있습니다.

카레



Curry는 여러 인수가 있는 함수를 중첩된 단항 함수로 변환합니다.

이것은 일부 인수가 적용된 함수를 생성할 수 있기 때문에 유용합니다.

예를 들어, 이진 함수를 변환할 수 있습니다.

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


다음을 작성하여 다른 단항 함수를 반환하는 함수 단항 함수로:

const addCurried = x => y => x + y;

addCurried 함수는 매개변수x를 사용하고 yx의 합을 함께 반환하는 매개변수y를 사용하는 함수를 반환합니다.

그런 다음 다음과 같이 작성하여 사용할 수 있습니다.

const add1 = addCurried(1);
const sum = add1(2);

addCurried가 1로 설정된 함수를 반환하고 x 변수에 할당하기 위해 1로 add를 호출했습니다.

그런 다음 2로 add1를 호출하여 최종 합계를 반환합니다.

우리는 이진 함수인 하나의 인수를 취하는 함수를 반환하는 함수를 만들어 이를 일반화할 수 있습니다.

해당 함수 내에서 두 번째 인수를 취하는 함수를 반환합니다.

그리고 그 내부에서 외부 함수의 매개변수로 호출된 이진 함수의 결과를 반환합니다.

예를 들어 다음과 같이 작성할 수 있습니다.

const curry = (binaryFn) => {
  return (firstArg) => {
    return (secondArg) => {
      return binaryFn(firstArg, secondArg);
    };
  };
};

const add = (x, y) => x + y
const sum = curry(add)(1)(2);


우리가 설명한 것을 수행하기 위해 curry 함수를 생성합니다.

그런 다음 add 함수와 같은 이진 함수를 전달할 수 있습니다.

그러면 자동으로 카레가 됩니다.

인수가 하나만 남을 때까지 하나의 인수로 함수를 재귀적으로 반환하는 curry 함수로 이것을 더 일반화할 수 있습니다.

예를 들어 다음과 같이 작성할 수 있습니다.

let curry = (fn) => {
  if (typeof fn !== 'function') {
    throw Error('No function provided');
  }

  return function curriedFn(...args) {
    if (args.length < fn.length) {
      return function(...moreArgs) {
        return curriedFn(...[...args, ...moreArgs]);
      };
    }
    return fn(...args);
  };
};

fn가 함수인지 확인합니다.

그렇다면 fnargs보다 더 많은 매개변수가 있는 경우 반환되는 동일한 함수를 호출하는 함수를 반환하는 함수를 반환합니다.
fn 보다 args 에 인수가 더 많다면   더 많이 카레를 만들 수 있다는 의미입니다.

커리된 함수의 매개변수 수가 fn 의 매개변수 수와 같으면 더 커링할 수 없습니다.

그래서 우리는 그냥 함수를 호출합니다.

그런 다음 다음과 같이 작성하여 호출할 수 있습니다.

const add = (x, y, z) => x + y + z;
const sum = curry(add)(1)(2)(3);


우리는 함수를 커리 처리했으므로 개별 인수를 사용하여 커리 함수를 호출합니다.

그리고 sum는 모든 숫자를 더하기 때문에 6입니다.

결론



일부 인수가 적용된 함수를 만들고 다른 용도로 해당 함수를 재사용할 수 있도록 함수를 커리할 수 있습니다.

좋은 웹페이지 즐겨찾기