2017-02-05 3 views
4

질문 : 어떻게 작성 하시겠습니까?
add (2) (5); // 7
add (2, 5); // 내가 위의 문제를 해결하기 위해 노력하고 7currying과 전통적인 다중 매개 변수를 지원하는 함수 만들기

: 를 내가 아는 다음과 같이 첫 번째 솔루션은 무두질 사용하여 구현 될 것이라고 :

var add = functoin(x){ 
return function (y){ 
return x+y; 
}; 
}; 

두 번째는 정상적인 기능 jsut 동안 :

var add = functoin(x,y){ 
return x+y; 
}; 

두 가지 방법을 동시에 사용할 수 있습니까?

답변

2

당신은 그와 다른 기능을 래핑하는 고차 기능을 사용할 수 있습니다 행동.

이 종류의 기능은 종종 curry이라고하며 많은 라이브러리 (예 : lodash)가 제공됩니다.

curry은 예상되는 인수가 모두 제공되었는지 확인하는 새로운 함수를 반환합니다. 보유하고있는 경우 originalFunction으로 전화합니다. 그렇지 않은 경우 부분적으로 적용된 함수를 반환합니다.

이 구현에서는 호출 규칙을 테스트하기 위해 Function#length을 사용하므로 여러 인수와 함께 작동합니다.

function curry (fn) { 
 
    return function (...args) { 
 
    if (args.length >= fn.length) { 
 
     return fn.call(this, ...args) 
 
    } else { 
 
     return curry(fn.bind(this, ...args)) 
 
    } 
 
    } 
 
} 
 

 
function add (x, y) { 
 
    return x + y; 
 
} 
 

 
// You can curry any function! 
 
const curriedAdd = curry(add); 
 

 
console.log(curriedAdd(1, 2)); // 3 
 
console.log(curriedAdd(1)(2)); // 3 
 
console.log(curriedAdd(1)); // a function

+1

'Function # length'는 선택적 인자를 포함하지 않는다는 것을 명심하십시오.이 구현체는'this'를 돕기 위해 특별한 일을하지 않습니다. 보통처럼, 카레 함수가 어떻게 호출되는지에 따라 결정됩니다. – joews

+1

2 개 이상의 매개 변수에서 작동하는 실제 currying을 수행하려면'return curry (fn.bind (null, ... args)) '를 수행해야합니다. – Bergi

+0

@Bergi 감사합니다. – joews

2

당신은에 전달 된 인수의 양을 검사하고 하나를 반환 할 수있는 하나 그것에 따라 :

function add(a, b) { 
 
    if (arguments.length == 2) { 
 
    return a + b; 
 
    } 
 
    return function(b) { 
 
    return add(a, b); 
 
    } 
 
} 
 

 
console.log(add(2)(5)); // 7 
 
console.log(add(2, 5)); // 7

+0

나은'함수 (b) {반환 부가 (a, b); }'당신이 코드 – Bergi

+0

@Bergi yup을 복제 할 필요가 없도록하기 위해, 실제로 재귀가 없다면 더 간단하다고 생각한 이후로 처음으로 전환했습니다. 다시 스위치를 켰어. – nem035

관련 문제