자바스크립트의 함수형 결합기 소개

함수형 프로그래밍의 핵심은 함수를 프로그램 작성의 기본 수단으로 사용하는 것입니다. 이는 구성된 함수형 프로그램이 함수임을 의미합니다. OOP에 익숙한 사람들에게는 함수만 사용하는 것이 터무니없게 보일 수 있지만 함수 구성의 강력함과 단순성 및 몇 가지 추가 개념을 사용하면 모든 크기의 테스트 가능한 응용 프로그램을 만들 수 있습니다. 빠른 소개로서 작은 프로그램에서 복잡한 프로그램을 빌드하는 데 도움이 될 수 있는 몇 가지 개념에 초점을 맞추고 싶습니다.

구성하다



고등학교 수학 시간에 이것을 "작성"또는 "°"로 기억할 수 있습니다. 두 함수 f와 g가 주어집니다(g ∘ f )(x) = g(f(x)). JS에서 다음과 같이 구현할 수 있습니다.

const compose = (g, f) => (x) => g(f(x))


이것은 고차 함수, 즉 함수를 인수로 받거나 반환하는 함수입니다. Compose는 둘 다 수행하여 두 개의 함수를 취한 다음 인수를 두 번째 함수에 적용한 다음 결과를 첫 번째 함수에 적용하는 하나를 반환합니다. 다음을 설명하기 위해 몇 가지 예제 함수를 만들어 보겠습니다.

const inc = n => n + 1;
const half = n => n / 2;

const operate = compose(half, inc);

console.log(operate(3)) //=> 2


고려해야 할 중요한 제약이 있습니다. compose 함수는 하나의 인수를 취하는 함수(단항 함수)에서만 작동합니다. 두 배로 번거로운 것은 작성 자체가 두 개의 인수를 취하므로 프랙탈 방식으로 사용할 수 없다는 것입니다. 그러면 안 됩니다. 다행스럽게도 함수를 단항으로 만드는 멋진 트릭이 있습니다. 바로 커링입니다.

카레



Currying은 여러 인수를 받는 함수를 첫 번째 인수를 취하고 결과를 반환하기 전에 모든 인수가 전달될 때까지 재귀적으로 다음 인수를 받는 함수로 변환하는 행위입니다. 예를 들어 위의 inc 함수를 add 함수를 기반으로 리팩터링해 보겠습니다.

const add = (n, m) => n + m;


위의 add 함수는 일반적인 2인수(이진) 함수이지만 nm 사이에 화살표를 넣어 커리할 수 있습니다.

const add = n => m => n + m;
// now that its curried we can partially apply it to create 
// our inc function from before
const inc = add(1);


다시 방문하여 작성



이제 카레하는 방법을 알았으니 작성 함수 자체를 카레로 만들어 봅시다. 이것은 B-combinator로도 알려져 있으므로 여기서는 B-combinator라고 부르겠습니다.

const B = g => f => x => g(f(x));

// usage is similar to before
const operate = B(half)(inc)


부분적으로 적용된 작성 기능이 무엇인지 생각하기 어려울 수 있습니다. 다른 프로그램에 딱 맞는 어댑터가 있는 프로그램으로 생각하고 싶습니다. B(half)는 프로그램을 가져와 결과를 2로 나누는 프로그램을 반환하는 함수입니다.

이것을 사용하기에 가장 좋은 장소 중 하나는 중첩된 함수 호출을 볼 수 있는 모든 곳입니다.

const process = (arr) =>
  arr.map(a => 
    getUser(getFirstName(a))
  );

// can be rewritten as
const process = (arr) =>
  arr.map(B(getUser)(getFirstName));


이것은 빙산의 일각에 불과하며 직접 작성하고 가지고 놀아 보시기 바랍니다.

좋은 웹페이지 즐겨찾기