[javascript] Ramda를 활용한 함수 합성과 컴비네이터 개념

함수형 프로그래밍은 간결하고 모듈화된 코드 작성을 위해 많은 도구와 패턴을 제공합니다. Ramda는 함수형 프로그래밍을 위한 JavaScript 라이브러리로, 이번 글에서는 Ramda를 활용하여 함수 합성과 컴비네이터라는 개념을 살펴보겠습니다.

함수 합성 (Function Composition)

함수 합성은 여러 개의 함수를 결합하여 새로운 함수를 생성하는 것을 말합니다. 이를 통해 중복 코드를 제거하고 가독성을 높일 수 있습니다.

Ramda에서는 compose 함수를 제공하여 함수 합성을 할 수 있습니다. compose 함수는 오른쪽에서 왼쪽으로 함수를 합성하며, 합성된 함수는 다른 함수의 입력으로 사용될 수 있습니다.

const { compose, map, toUpper } = require('ramda');

const data = ['apple', 'banana', 'cherry'];

const transformData = compose(map(toUpper), map(word => word + 's'));

const result = transformData(data);
console.log(result); // ['APPLES', 'BANANAS', 'CHERRIES']

위의 예제에서 transformData 함수는 data 배열의 각 요소에 대해 문자열 뒤에 ‘s’를 붙인 후 대문자로 변환하는 과정을 거칩니다. 이렇게 여러 함수를 연결하여 새로운 함수를 생성할 수 있습니다.

컴비네이터 (Combinator)

컴비네이터는 작은 함수들을 조합하여 복잡한 동작을 수행하는 함수입니다. Ramda는 다양한 컴비네이터를 제공하여 함수 조합을 더욱 쉽게 할 수 있습니다.

pipe

pipe 함수는 compose와 유사하지만, 왼쪽에서 오른쪽으로 함수를 합성합니다. pipe 함수는 데이터가 왼쪽에서 오른쪽으로 흐를 때 사용됩니다.

const { pipe, map, toUpper } = require('ramda');

const data = ['apple', 'banana', 'cherry'];

const transformData = pipe(map(word => word + 's'), map(toUpper));

const result = transformData(data);
console.log(result); // ['APPLES', 'BANANAS', 'CHERRIES']

converge

converge 함수는 여러 함수를 실행한 후 그 결과로 다른 함수를 호출하는 함수입니다. converge를 사용하면 여러 값을 조합하여 다른 함수로 전달할 수 있습니다.

const { converge, subtract, multiply, length } = require('ramda');

const data = [1, 2, 3, 4, 5];

const calculateResult = converge(subtract, [
  converge(multiply, [length, length]),
  length
]);

const result = calculateResult(data);
console.log(result); // 20

위의 예제에서는 calculateResult 함수가 data 배열의 길이를 제곱해서 그 값과 배열의 길이를 뺀 결과를 반환합니다.

결론

Ramda를 활용하면 함수 합성과 컴비네이터를 쉽게 구현할 수 있습니다. 이를 통해 코드의 가독성과 재사용성을 높일 수 있으며, 복잡한 로직을 간결하게 표현할 수도 있습니다.

더 많은 Ramda의 기능과 활용 방법에 대해서는 공식 문서를 참고하시기 바랍니다.