[javascript] JavaScript 카레 : 실용적인 응용 프로그램은 무엇입니까?

나는 아직 카레를 먹지 않았다고 생각합니다. 나는 그것이 무엇을하고 어떻게하는지 이해합니다. 나는 그것을 사용할 상황을 생각할 수 없습니다.

JavaScript에서 카레를 사용하는 곳은 어디입니까? DOM 조작 또는 일반적인 응용 프로그램 개발 예제를 환영합니다.

답변 중 하나 는 애니메이션을 언급합니다. 같은 기능은 slideUp, fadeIn인수로 요소를 가지고 일반적으로 내장 된 기본 “애니메이션 기능”과 고차 함수를 반환하는 카레 기능입니다. 일부 기본 설정으로 더 높은 기능을 적용하는 것보다 왜 더 낫습니까?

그것을 사용하는 데 단점이 있습니까?

요청에 따라 JavaScript 커리에 대한 좋은 자료가 있습니다.

의견에서 자라면서 더 추가하겠습니다.


따라서 답변에 따르면 일반적으로 카레 및 부분 적용은 편의 기술입니다.

동일한 구성으로 고수준 함수를 호출하여 자주 “정제”하는 경우, 고수준 함수를 카레 (또는 Resig의 일부 사용)하여 간단하고 간결한 도우미 메서드를 만들 수 있습니다.



답변

@ 행복한 게이

EmbiggensTheMind의 의견에 답변 :

카레 자체만으로도 JavaScript에서 유용한 인스턴스는 생각할 수 없습니다 . 여러 인수를 가진 함수 호출을 각 호출마다 단일 인수를 가진 함수 호출 체인으로 변환하는 기술이지만 JavaScript는 단일 함수 호출에서 여러 인수를 지원합니다.

JavaScript에서는 (람다 미적분학이 아닌) 대부분의 다른 실제 언어를 가정하지만 일반적으로 부분 응용 프로그램과 관련이 있습니다. John Resig 는 더 잘 설명 하지만 요점은 두 개 이상의 인수에 적용될 논리가 있으며 일부 인수에 대한 값만 알고 있다는 것입니다.

부분적 응용 프로그램 / 커링을 사용하여 알려진 값을 수정하고 알 수없는 값만 허용하는 함수를 반환하여 나중에 실제로 전달하려는 값이있을 때 호출 할 수 있습니다. 이렇게하면 동일한 값을 제외한 모든 값을 사용하여 동일한 JavaScript 내장 함수를 반복해서 호출했을 때 자신을 반복하지 않아도됩니다. 요한의 예를 훔치려면 :

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );


답변

클로저를 사용하는 JavaScript에서 흥미롭고 실용적인 커리 사용은 다음과 같습니다 .

function converter(toUnit, factor, offset, input) {
    offset = offset || 0;
    return [((offset + input) * factor).toFixed(2), toUnit].join(" ");
}

var milesToKm = converter.curry('km', 1.60936, undefined);
var poundsToKg = converter.curry('kg', 0.45460, undefined);
var farenheitToCelsius = converter.curry('degrees C', 0.5556, -32);

milesToKm(10);            // returns "16.09 km"
poundsToKg(2.5);          // returns "1.14 kg"
farenheitToCelsius(98);   // returns "36.67 degrees C"

curry확장은 의 확장에 의존 Function하지만 사용하는 것만 볼 수 있습니다 apply(너무 화려 하지는 않습니다).

Function.prototype.curry = function() {
    if (arguments.length < 1) {
        return this; //nothing to curry with - return function
    }
    var __method = this;
    var args = toArray(arguments);
    return function() {
        return __method.apply(this, args.concat([].slice.apply(null, arguments)));
    }
}

답변

functools.partialJavaScript 와 유사한 파이썬과 유사한 함수를 발견했습니다 .

function partial(fn) {
  return partialWithScope.apply(this,
    Array.prototype.concat.apply([fn, this],
      Array.prototype.slice.call(arguments, 1)));
}

function partialWithScope(fn, scope) {
  var args = Array.prototype.slice.call(arguments, 2);
  return function() {
    return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
  };
}

왜 그것을 사용하고 싶습니까? 이것을 사용하려는 일반적인 상황 this은 함수를 값 에 바인딩하려는 경우입니다.

var callback = partialWithScope(Object.function, obj);

콜백이 호출되면를 this가리 킵니다 obj. 이것은 일반적으로 코드가 짧아 지므로 이벤트 상황이나 공간을 절약하는 데 유용합니다.

카레는 카레가 반환하는 함수가 하나의 인수를 받아 들인다는 점에서 부분적으로 유사합니다 (내가 이해하는 한).


답변

Hank Gay에 동의하기-특정 기능 프로그래밍 언어에 매우 유용합니다. 필요한 부분이기 때문입니다. 예를 들어, Haskell에서는 단순히 함수에 여러 개의 매개 변수를 사용할 수 없습니다. 순수한 함수형 프로그래밍에서는 그렇게 할 수 없습니다. 한 번에 하나의 매개 변수를 사용하여 함수를 작성하십시오. JavaScript에서는 “converter”와 같은 고안된 예제에도 불구하고 단순히 불필요합니다. 카레를 넣지 않아도 동일한 변환기 코드가 있습니다.

var converter = function(ratio, symbol, input) {
    return (input*ratio).toFixed(2) + " " + symbol;
}

var kilosToPoundsRatio = 2.2;
var litersToUKPintsRatio = 1.75;
var litersToUSPintsRatio = 1.98;
var milesToKilometersRatio = 1.62;

converter(kilosToPoundsRatio, "lbs", 4); //8.80 lbs
converter(litersToUKPintsRatio, "imperial pints", 2.4); //4.20 imperial pints
converter(litersToUSPintsRatio, "US pints", 2.4); //4.75 US pints
converter(milesToKilometersRatio, "km", 34); //55.08 km

나는 “자바 스크립트 : 좋은 부분들”에서 Douglas Crockford가 자신의 핸디 한 말보다는 카레의 역사와 실제 사용에 대해 언급했으면 좋겠다. 그것을 읽은 후 가장 오랫동안, 나는 함수형 프로그래밍을 공부하고 그것이 어디에서 왔는지 깨달을 때까지 혼란에 빠졌습니다.

좀 더 생각한 후에 JavaScript에서 카레를 사용하는 유효한 유스 케이스가 하나 있다고 생각합니다. JavaScript를 사용하여 순수한 함수형 프로그래밍 기술을 사용하여 작성하려는 경우. 그러나 드문 유스 케이스처럼 보입니다.


답변

그것은 마법이나 아무것도 아닙니다 … 익명 함수의 유쾌한 속기입니다.

partial(alert, "FOO!") 에 해당 function(){alert("FOO!");}

partial(Math.max, 0) 에 해당 function(x){return Math.max(0, x);}

부분적인 호출 ( MochiKit 용어. 다른 라이브러리는 함수에 .curry 메소드를 제공하여 동일한 기능을 수행한다고 생각합니다)은 익명 함수보다 약간 멋지고 시끄 럽습니다.


답변

그것을 사용하는 라이브러리는 항상 Functional 입니다.

JS에서 언제 유용합니까? 아마도 같은 시간에 다른 현대 언어에서도 유용하지만, 그것을 사용하는 것을 볼 수있는 유일한 시간은 부분 응용 프로그램과 관련이 있습니다.


답변

JS의 모든 애니메이션 라이브러리는 카레를 사용하고 있다고 말할 수 있습니다. 각 호출에 대해 영향을받는 요소 및 요소의 동작 방식을 설명하는 함수 세트를 전달하는 대신 모든 타이밍 요소를 보장하는 고차 함수로 대체하십시오. 일반적으로 고객이 공개 API로 쉽게 릴리스 할 수 있습니다. “slideUp”, “fadeIn”과 같은 함수로, 요소 만 인수로 사용하며 기본 “애니메이션 함수”가 내장 된 고차 함수를 반환하는 일부 카레 함수입니다.