-
Notifications
You must be signed in to change notification settings - Fork 13
Javascript Currying VS Partial Application
번역 : https://medium.com/datadriveninvestor/javascript-currying-vs-partial-application-4db5b2442be8
많은 사람들이 커링과 파티셜 어플리케이션을 혼동합니다. 그리고 많은 사람들이 언제 무엇을 어디서 사용해야 할지를 잘 모릅니다. 그래서 이 포스트는 그들 사이의 사용법과 차이점을 다뤄보도록 하겠습니다.
N개의 인수를 가진 함수 호출을 각 함수 호출에 대해 단일 인수를 가진 N 함수 호출 체인으로 변환하는 기술입니까?
Currying은 모든 인수가 적용될 때까지 항상 하나의 인수로 다른 함수를 반환합니다. 따라서 모든 인수를 다 사용하고 최종 값이 반환 될 때까지 반환 된 함수를 계속 호출합니다.
// Normal function
function addition(x, y) {
return x + y;
}
// Curried function
function addition(x) {
return function(y) {
return x + y;
}
}
참고 : Curry는 이진 함수를 사용하여 단항 함수를 반환하는 단항 함수를 반환합니다. JavaScript 코드는 다음과 같습니다.
function curry(f) {
return function(x) {
return function(y) {
return f(x, y);
}
}
}
참고 : 커링이된 함수에는 반복자 동작이 내장되어 있습니다. 한 번에 하나의 인수가 적용되고 다음 단계에서 사용할 호출 함수로 리턴됩니다. 반복자에 대해 여기here를 읽으십시오.
-
커리 함수의 일반적인 사용 사례는 ** 함수 구성 **입니다 (예 :
p (x) = q (r (x))
). 즉, 인수를 전달하여 이전 함수에서 새 함수를 작성합니다. 함수q
는 함수r
의 인수로 반환 값을 받습니다. 함수는 하나의 값만 반환 할 수 있으므로 반환 값에 적용되는 함수는 단항이어야 합니다. -
커링된 함수는 일반 기능을 생성 할 수있는 많은 가능성이있는 프로젝트의 ** 인프라구조 설정 ** 동안에도 사용될 수 있으므로 작은 조각을 쉽게 구성하고 재사용 할 수 있습니다.
-
Ramda.js 라이브러리. 함수는 자동으로 커링되며 lodash에는 curry라는 함수가 있으며이 함수는 커링 기능을 만드는 데 사용할 수 있습니다.
-
Memoization 커링 함수를 위한 다른 좋은 케이스 입니다.
-
Handling error 에러를 발생시키는 함수의 핸들링과 에러 직후 즉시 종료 처리.
-
API에서의 Catching multiple error and use it as a validator 처리와 클라이언트 사이드 코드.
-
함수를 인자로 받아서 그 값을 리턴할 수 있는 First class functions 를 생성할 수 있다.
const func1 = () => console.log ('Hey Medium.');
const firstClassfunc1 = argsFunc => argsFunc();
const firstClassfunc2 = () => func1;
firstClassfunc1 (firstClassfunc2()); // Hey Medium.
[![Watch the video](https://i.ytimg.com/vi/m3svKOdZijA/sddefault.jpg)](https://www.youtube.com/embed/m3svKOdZijA?wmode=opaque&widget_referrer=https%3A%2F%2Fmedium.com%2Fdatadriveninvestor%2Fjavascript-currying-vs-partial-application-4db5b2442be8&enablejsapi=1&origin=https%3A%2F%2Fcdn.embedly.com&widgetid=1)
const compose = (…fns) =>
fns.reduce((f, g) => (…args) => f(g(…args)));
Here 여기 ES5를 사용하여 자체 커링 팩토리 함수를 만드는 방법에 대한 좋은 기사.
함수에 여러 인수를 고정하여 더 작은 인수의 다른 함수, 즉 함수 체인이 진행됨에 따라 하나 이상의 인수에 값을 바인딩하는 다른 함수를 생성하는 기술입니다.
function add1(x) {
return 1 + x;
}
JavaScript에는 여러 개의 인수가있는 함수에서 작동하는 임의의 양의 매개 변수를 바인딩 할 수있는 내장 메소드 .bind가 있습니다. 호출의 구문은 다음과 같습니다.
function.bind(_thisValue_, [_arg1_], [_arg2_], ...)
이 함수는 암시적인 이 매개 변수가 초기 인수로 항상 지정된 새 함수로 바뀝니다.
function addition(x, y) {
return x + y;
}
const plus5 = addition.bind(null, 5)
plus5(10) // output -> 15
참고 : this 값은 (메소드가 아닌) 함수 추가에 중요하지 않으므로이 값이 null입니다.
밑줄이나 lodash를 사용할 때 이 bind 메소드보다 훨씬 좋은 partial 함수를 사용할 수 있습니다.
다음은 partial 어플리케이션 프로그램 및 왼쪽, 오른쪽 partial 어플리케이션 프로그램 기능 구현에 대한 자세한 게시물 Here입니다.
- 커링은 항상 중첩 된 단항 (1 차) 기능을 생성합니다. 변환 된 함수는 여전히 원본과 동일합니다. (원본 함수는 여전히 해당 인자들의 갯수를 원합니다. )
- partial 어플리케이션은 임의의 수의 인수 함수를 생성합니다. 변환 된 함수는 원래 함수와 다릅니다. 인수가 더 적습니다.
- 커링은 partial 어플리케이션이 아닙니다. partial 어플리케이션 프로그램을 사용하여 구현할 수 있습니다. 많은 수의 인수를 취하는 함수를 커링 할 수 없습니다. (인수의 수를 수정하지 않는 한).
보다 추상적인 기능의 재사용이 쉬워 코드가 깨끗 해지고 복잡성이 줄어 코드 표현력과 유지 관리 성이 향상됩니다.
이 기사의 일부 리소스를 참고했습니다.
일부 의역이 들어간 경우도 있으므로 해당 원문의 내용과 조금 다를 수 있습니다.
문제가 될 소지가 있다거나 혹은 수정이 필요한 사항이 있다면 있다면 issues 보내주세요.
기술문서
- 호출스택
- 원시자료형
- 값타입과 참조타입
- 명시적 변환, 암시적 변환, Nominal, 구조화, 덕 타이핑
- == vs === vs typeof
- 함수 범위, 블록 범위, 렉시컬(lexical) 범위
- 식(expression) vs 문(statement)
- IIFF, Modules, Namespaces
- 메세지큐와 이벤트루프
- setTimeout, setInterval, requestAnimationFrame
- 자바스크립트 엔진
- 비트 연산자, 형식화 배열, 버퍼(배열)
- DOM과 Layout Trees
- 팩토리와 클래스
- this, call, apply, bind
- new, 생성자, instanceof, 인스턴스
- 프로토타입의 상속과 체인
- Object.create와 Object.assign
- map, reduce, filter
- 순수함수, 부수효과, 상태변이
- Closure
- 고차함수
- 재귀
- 컬렉션과 생성기
- Promise
- async, await
- 자료구조
- 함수 성능과 빅 오 표기법
- 알고리즘
- 상속, 다형성, 코드의 재사용성
- 설계패턴
- 부분 어플리케이션, 커링, Compose, Pipe
- 클린코드