JavaScript로 기존 함수 커링하기

이 게시물은 이미 정의된 polyadic 함수를 curried 함수로 변환하는 것에 관한 것입니다.

이것은 이라는 제목의 카레 함수에 대한 시리즈의 세 번째 게시물입니다. 이것은 이라는 이전 게시물을 따릅니다.

기본 vs 고급 커링



기본 커링은 함수를 인수로 사용하지 않는 반면 고급 커링은 수행하기 때문에 기본 커링 함수는 고급 함수와 다릅니다. 기본 커링 함수는 처음부터 정의되는 반면 고급 커링은 이미 존재하는 여러 함수를 사용하는 것과 관련됩니다.

더 높은 수준에서 커링은 작성자가 하드코딩했는지 런타임 시 변환되었는지 여부에 관계없이 일련의 단항 함수를 반환하기 위해 커링되지 않은 함수를 변환하는 접근 방식에 가깝습니다.

복잡성 수준이 다른 몇 가지 고급 사례를 고려할 것입니다. 첫 번째는 처음부터 수동으로 정의된 래퍼 함수와 관련되지만 전달된 to-be-curried 함수를 기반으로 합니다.

다음 게시물에서는 자동 커링, 가변 커링, 무한 커링 및 고정 인수에 대한 커링도 다룰 것입니다.

이 문서에서는 기존 함수를 수동으로 커링하는 방법을 다룹니다.

기존 함수를 수동으로 커링하기



이 예제에서는 이전 게시물에서 작성한 createMessage() 함수를 사용합니다.

메시지 문자열을 반환하는 함수가 있다고 가정해 보겠습니다.

function createMessage(greeting, name, message) {
  return `${greeting}, ${name}! ${message}`;
};


위의 함수에 대해 처음부터 커리 함수를 작성하는 대신 다음과 같이 합니다.

function createMessage(greeting) {
  return function(name) {
    return function(message) {
      return `${greeting}, ${name}! ${message}`;
    };
  };
};


기존 다중 함수를 래퍼 함수에 전달한 다음 그 위에 래퍼 함수를 ​​빌드하여 사용할 수 있습니다.

function curryATernaryFunction(f) {
  return function(greeting) {
    return function(name) {
      return function(message) {
        return f(greeting, name, message);
      };
    };
  };
};


그런 다음 createMessage로 래퍼 함수를 ​​호출하면 커링된 함수가 제공됩니다. 나중에 목적에 맞게 사용할 수 있습니다.

const curriedCreateMessage = curryATernaryFunction(createMessage);
console.log(curriedCreateMessage('Hi')('Haskell')('Whadup?'));
// Hi, Haskell! Whadup?



위의 함수 이름을 curryATernaryFunction로 명명한 이유는 조금 가지고 놀고 싶었기 때문입니다. 실제로 다른 삼항 함수(세 개의 인수를 취하는 함수)를 커링할 수 있습니다.

function addThreeThings(one, two, three) {
  return one + two + three;
};

console.log(curryATernaryFunction(addThreeThings)('Hi')('Haskell')('Whadup?'));
// HiHaskellWhadup?
console.log(curryATernaryFunction(addThreeThings)(1)(2)(3)); // 6



작동 방식:
래퍼 함수를 ​​누산기라고 합니다. 그 목적은 전달된 모든 인수를 저장하고 다중 함수에서 사용할 수 있도록 하는 것입니다. 최종 반환 함수에 대한 모든 인수를 누적하기 위해 중첩 클로저(어휘적 환경과 함께 중첩의 각 수준에서 반환된 함수)를 사용합니다.

그것이 작동하는 방식은 반환된 함수가 호출되고 주어진 인수를 취할 때마다 인수가 바로 중첩된 함수의 어휘 범위에 보관되어 범위 체인을 통해 더 깊은 함수에서 사용할 수 있도록 하는 것입니다. 따라서 핵심 함수의 실행 컨텍스트는 모든 인수에 액세스할 수 있습니다.

좋은 웹페이지 즐겨찾기