Skip to content

Javascript Currying VS Partial Application

chchoing88 edited this page Nov 3, 2019 · 1 revision

Javascript- Currying VS Partial Application

번역 : https://medium.com/datadriveninvestor/javascript-currying-vs-partial-application-4db5b2442be8

많은 사람들이 커링과 파티셜 어플리케이션을 혼동합니다. 그리고 많은 사람들이 언제 무엇을 어디서 사용해야 할지를 잘 모릅니다. 그래서 이 포스트는 그들 사이의 사용법과 차이점을 다뤄보도록 하겠습니다.

Currying

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를 읽으십시오.

Usages

  1. 커리 함수의 일반적인 사용 사례는 ** 함수 구성 **입니다 (예 :p (x) = q (r (x))). 즉, 인수를 전달하여 이전 함수에서 새 함수를 작성합니다. 함수 q 는 함수 r 의 인수로 반환 값을 받습니다. 함수는 하나의 값만 반환 할 수 있으므로 반환 값에 적용되는 함수는 단항이어야 합니다.

  2. 커링된 함수는 일반 기능을 생성 할 수있는 많은 가능성이있는 프로젝트의 ** 인프라구조 설정 ** 동안에도 사용될 수 있으므로 작은 조각을 쉽게 구성하고 재사용 할 수 있습니다.

  3. Ramda.js 라이브러리. 함수는 자동으로 커링되며 lodash에는 curry라는 함수가 있으며이 함수는 커링 기능을 만드는 데 사용할 수 있습니다.

  4. Memoization 커링 함수를 위한 다른 좋은 케이스 입니다.

  5. Handling error 에러를 발생시키는 함수의 핸들링과 에러 직후 즉시 종료 처리.

  6. API에서의 Catching multiple error and use it as a validator 처리와 클라이언트 사이드 코드.

  7. 함수를 인자로 받아서 그 값을 리턴할 수 있는 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)

Curry Factory Method(ES6)

const compose = (…fns) =>
  fns.reduce((f, g) => (…args) => f(g(…args)));

Here 여기 ES5를 사용하여 자체 커링 팩토리 함수를 만드는 방법에 대한 좋은 기사.

Partial Application

함수에 여러 인수를 고정하여 더 작은 인수의 다른 함수, 즉 함수 체인이 진행됨에 따라 하나 이상의 인수에 값을 바인딩하는 다른 함수를 생성하는 기술입니다.

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입니다.

Difference

  • 커링은 항상 중첩 된 단항 (1 차) 기능을 생성합니다. 변환 된 함수는 여전히 원본과 동일합니다. (원본 함수는 여전히 해당 인자들의 갯수를 원합니다. )
  • partial 어플리케이션은 임의의 수의 인수 함수를 생성합니다. 변환 된 함수는 원래 함수와 다릅니다. 인수가 더 적습니다.
  • 커링은 partial 어플리케이션이 아닙니다. partial 어플리케이션 프로그램을 사용하여 구현할 수 있습니다. 많은 수의 인수를 취하는 함수를 커링 할 수 없습니다. (인수의 수를 수정하지 않는 한).

Advantages

보다 추상적인 기능의 재사용이 쉬워 코드가 깨끗 해지고 복잡성이 줄어 코드 표현력과 유지 관리 성이 향상됩니다.

이 기사의 일부 리소스를 참고했습니다.

Clone this wiki locally