Polyfill: 나만의 curry() 만들기

얼마 전 인터뷰에서 이런 질문을 봤다.

함수에 전달될 때 함수의 커링된 버전을 반환하는 메서드 커리를 만듭니다.

const join = (a,b,c) => {
  return `${a}_${b}_${c}`
}

const curriedJoin = curry(join);

console.log(curriedJoin(1)(2,3)); //1_2_3
console.log(curriedJoin(1,2)(3)); //1_2_3
console.log(curriedJoin(1)(2)()()(3)); //1_2_3
console.log(curriedJoin(1,2,3)); //1_2_3 



커링이란?



위키피디아 내용:

In mathematics and computer science, currying is the technique of converting a function that takes multiple arguments into a sequence of functions that each takes a single argument.



여러 인수를 사용하는 함수는 단일 인수를 사용하는 일련의 함수로 변환됩니다.

초기 접근



정의에 따라 함수가 구성되는 방식은 다음과 같습니다.

const curry = (fn) => {

const curriedFunction = (...args) => {


};
return curriedFunction;
};


이 함수는 인수 함수fn를 사용하고 새 함수를 반환합니다.
반환된 함수는 인수를 예상하며 처리 용이성을 위해 ...args (Rest Operator)이 사용됩니다. 무한 수의 인수를 처리하는 방법입니다. 이제 args는 모든 함수 인수가 있는 배열입니다.

함수 반환



커링된 함수가 호출될 때마다 함수가 반환되어야 합니다. 또한 시퀀스의 모든 단계에서 전달되는 인수를 추적해야 합니다. 함수를 실행하고 싶을 때 fn...args 를 호출할 수 있습니다.

const curry = (fn) => {

  const curried = (...args) => {
    let arr = [];
      arr = [...arr,...args];
      const innerFunc = (...innerArgs) => {
      arr =[...arr,...innerArgs];
        if(arr.length === fn.length){
          return fn(...arr);
        }
        else{
          return innerFunc;
        }


     };
      return innerFunc;
    } 
    return curried;
};


fn.length fn에서 예상하는 매개변수의 수를 반환합니다. javascript 함수는 전달된 만큼 많은 인수를 사용할 수 있지만 이 값은 항상 형식 매개변수의 수를 반환합니다.

기본 조건에서 유용합니다. 배열의 길이가 예상되는 매개변수의 수와 같아지는 즉시 콜백 함수를 호출할 수 있습니다.

에지 조건



위의 솔루션은 다음을 제외한 대부분의 경우를 해결합니다.

console.log(curriedJoin(1,2,3));


이를 처리하려면 첫 번째 이동 자체에서 모든 인수가 전달되는 경우 함수에 또 다른 검사가 있어야 합니다.

const curry = (fn) => {

  const curried = (...args) => {
    let arr = [];
   if(args.length === fn.length){
     return fn(...args);
   }
   else{
      arr = [...arr,...args];
      const innerFunc = (...innerArgs) => {
      arr =[...arr,...innerArgs];
        if(arr.length === fn.length){
          return fn(...arr);
        }
        else{
          return innerFunc;
        }


     };
      return innerFunc;
    } 
  }
  return curried;
}


요약



이 문제는 클로저에 대한 솔버의 이해도를 테스트합니다. 또한 솔버가 Function 프로토타입의 길이 속성을 알고 있다는 사실에 의존하지만 그것이 요점은 아닙니다. 중첩이 많기 때문에 복잡한 시나리오에서 솔버가 얼마나 명확하게 생각하는지 확인하는 좋은 방법입니다.

어떻게 해결할 것인지 댓글로 알려주세요.

좋은 웹페이지 즐겨찾기