Javascript의 맥락에서 "부분 함수 응용 프로그램"은 잘못된 이름입니까?

StackOverflow https://stackoverflow.com/questions/92984

  •  01-07-2019
  •  | 
  •  

문제

내 친구와 나는 Javascript에서 카레링과 부분 함수 적용에 관해 토론 중이었고 둘 중 하나가 달성 가능한지에 대해 매우 다른 결론에 도달했습니다.나는이 구현을 생각해 냈습니다. Function.prototype.curry, 이는 우리 토론의 기초였습니다.

Function.prototype.curry = function() {
    if (!arguments.length) return this;

    var args = Array.prototype.slice.apply(arguments);
    var mmm_curry = this, args;

    return function() {
        var inner_args = Array.prototype.slice.apply(arguments);
        return mmm_curry.apply(this, args.concat(inner_args));
    }

}

이는 다음과 같이 사용됩니다:

var vindaloo = function(a, b) {
    return (a + b);
}

var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);

print(masala);
print(other);

Spidermonkey의 출력은 다음과 같습니다.

$ js curry.js
3
4

그의 의견은 자바스크립트 이후로 function 기본 요소는 기본적으로 "부분 함수 적용"을 지원하지 않습니다. 변수에 바인딩된 함수를 참조하는 것은 완전히 잘못된 것입니다. karahi 부분적으로 적용된 것처럼.그의 주장은 다음과 같았습니다. vindaloo 함수가 카레되면 "부분적으로 적용된 함수"가 아닌 함수 자체가 완전히 적용되고 클로저가 반환됩니다.

제 생각에는 Javascript 자체는 '부분적 적용'을 지원하지 않지만 function 기본 요소(ML이나 Haskell과 달리)는 부분적으로 적용된 함수의 개념을 캡슐화할 수 있는 언어의 고차 함수를 만들 수 없다는 의미는 아닙니다.또한 "적용"되었음에도 불구하고 함수의 범위는 여전히 반환된 클로저에 바인딩되어 있어 "부분적으로 적용된" 상태로 유지됩니다.

어느 것이 맞나요?

도움이 되었습니까?

해결책

기술적으로는 원래 함수를 호출하는 새로운 함수를 생성하는 것입니다.따라서 부분 적용 기능에 대한 제가 이해한 것이 맞다면 이는 부분 적용 기능이 아닙니다.부분적으로 적용된 함수는 이에 더 가깝습니다(일반적인 해결 방법은 아님).

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC, 이것은 여전히 ​​부분적으로 적용되는 기능이 아닙니다.하지만 더 가깝습니다.실제로 부분적으로 적용된 함수는 코드를 검토하면 실제로 다음과 같습니다.

function karahi(b) {
    return 1 + b;
};

따라서 기술적으로 원래 방법은 ~이다 클로저 내에 바인딩된 함수를 반환하는 것뿐입니다.JavaScript에서 함수를 부분적으로 적용하기 위해 제가 생각할 수 있는 유일한 방법은 함수를 구문 분석하고 변경 사항을 적용한 다음 eval()을 통해 실행하는 것입니다.

그러나 귀하의 솔루션은 개념을 JavaScript에 실용적으로 적용한 것이므로 기술적으로 정확하지 않더라도 실제로 말하면 목표를 달성합니다.

다른 팁

JavaScript의 부분 함수 응용 프로그램에 대해 이야기하는 것이 완벽하다고 생각합니다. 부분 응용 프로그램과 같이 작동하면 하나 여야합니다.또 어떻게 이름을 짓겠습니까?

당신은 어떠한가요 카레 기능은 그의 목표는 단지 ​​구현 세부 사항 일뿐입니다.비슷한 방식으로 우리는 ECMAScript 사양에서 부분적으로 응용 프로그램을 가질 수 있지만, 즉, IE가 당신이했던 것처럼 그것을 구현할 때, 당신은 알 수있는 방법이 없을 것입니다.

기술적인 세부 사항은 나에게 중요하지 않습니다. 의미가 동일하게 유지되고 모든 의도와 목적에 대해 함수가 실제로 부분적으로 적용된 함수인 것처럼 작동한다면 누가 신경쓰겠습니까?

나는 사물에 대해 학구적이었지만 그러한 세부 사항에 대해 걱정하는 것은 결국 실제 작업을 완료하지 못합니다.

개인적으로 저는 모찌킷;여기에는 그러한 생성을 돕는 멋진 부분() 함수가 있습니다.나는 그것을 좋아한다.

꼭 확인해 보세요 커리된 JavaScript 함수.나는 그의 카레 기능에 대해 완전히 이해하지 못했지만 당신의 대답이 있을 수도 있습니다.

편집하다:그러나 나는 당신의 평가에 동의합니다.

그의 의견은 Javascript 함수 프리미티브가 기본적으로 "부분 함수 적용"을 지원하지 않기 때문이라는 것이었습니다.

ES6에서는 매우 우아하게 커링을 수행할 수 있습니다.

> const add = a => b => a + b
> const add10 = add(10)
> [1,2,3].map(add10)
[ 11, 12, 13 ]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top