>  기사  >  웹 프론트엔드  >  함수형 프로그래밍의 기초

함수형 프로그래밍의 기초

DDD
DDD원래의
2024-09-26 12:46:42166검색

Fundamentals of Functional Programming

소개

함수형 프로그래밍(FP)은 단순한 프로그래밍 패러다임 그 이상입니다. 그것은 코드에 대해 생각하는 다른 방식입니다. 수학 함수에 뿌리를 둔 FP는 명령 실행보다는 표현 평가를 강조합니다. FP의 핵심 개념을 살펴보면서 이 접근 방식이 어떻게 더 예측 가능하고, 유지 관리 가능하며, 더 간결한 코드로 이어질 수 있는지 알게 될 것입니다.

함수형 프로그래밍의 핵심 개념

1. 순수 기능

함수형 프로그래밍의 핵심에는 순수 함수 개념이 있습니다. 순수 함수는 다음과 같습니다.

  • 항상 동일한 입력에 대해 동일한 출력을 반환합니다
  • 부작용이 없습니다
// Pure function
const add = (a, b) => a + b;

// Impure function (relies on external state)
let total = 0;
const addToTotal = (value) => {
  total += value;
  return total;
};

순수 함수는 예측 가능하고 테스트, 디버깅, 병렬화가 더 쉽습니다.

2. 불변성

불변성은 데이터가 생성되면 변경하지 않는 방식입니다. 기존 데이터를 수정하는 대신 원하는 변경 사항을 적용하여 새로운 데이터 구조를 만듭니다.

// Mutable approach
const addItemToCart = (cart, item) => {
  cart.push(item);
  return cart;
};

// Immutable approach
const addItemToCart = (cart, item) => [...cart, item];

불변성은 의도하지 않은 부작용을 방지하고 애플리케이션의 변경 사항을 더 쉽게 추적하는 데 도움이 됩니다.

3. 일급 및 고차 함수

FP에서 함수는 일급 시민으로 취급됩니다. 즉, 다음과 같은 역할을 할 수 있습니다.

  • 변수에 할당
  • 다른 함수에 인수로 전달됩니다
  • 함수에서 반환됨

다른 함수에 작용하는 함수를 고차 함수라고 합니다.

// Higher-order function
const withLogging = (fn) => {
  return (...args) => {
    console.log(`Calling function with args: ${args}`);
    return fn(...args);
  };
};

const add = (a, b) => a + b;
const loggedAdd = withLogging(add);

console.log(loggedAdd(2, 3)); // Logs: Calling function with args: 2,3
                              // Output: 5

이 개념은 강력한 추상화와 코드 재사용을 가능하게 합니다.

4. 기능 구성

함수 합성은 두 개 이상의 함수를 결합하여 새로운 함수를 생성하는 과정입니다. 이는 단순한 작업에서 복잡한 작업을 구축하기 위한 FP의 기본 기술입니다.

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

const addOne = (x) => x + 1;
const double = (x) => x * 2;

const addOneThenDouble = compose(double, addOne);

console.log(addOneThenDouble(3)); // Output: 8

5. 재귀

FP에만 국한되지는 않지만 함수형 프로그래밍에서는 반복보다 재귀가 선호되는 경우가 많습니다. 반복적인 성격을 지닌 문제에 대해 보다 우아한 솔루션을 제공할 수 있습니다.

const factorial = (n) => {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
};

console.log(factorial(5)); // Output: 120

6. 선언적 vs 명령적

함수형 프로그래밍은 어떻게 해야 할지보다는 무엇을 해야 할지에 초점을 맞춘 선언적 스타일을 선호합니다.

// Imperative
const doubleNumbers = (numbers) => {
  const doubled = [];
  for (let i = 0; i < numbers.length; i++) {
    doubled.push(numbers[i] * 2);
  }
  return doubled;
};

// Declarative
const doubleNumbers = (numbers) => numbers.map(n => n * 2);

선언적 접근 방식이 더 간결하고 한눈에 이해하기 쉬운 경우가 많습니다.

고급 개념

7. 카레

커링은 여러 인수를 취하는 함수를 각각 단일 인수를 취하는 일련의 함수로 변환하는 기술입니다.

const curry = (fn) => {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };
};

const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // Output: 6
console.log(curriedAdd(1, 2)(3)); // Output: 6

Curry를 사용하면 더욱 유연하고 재사용 가능한 함수 정의를 얻을 수 있습니다.

8. 펑터와 모나드

이것은 FP의 고급 개념으로, 부작용 처리 및 순차 계산에 자주 사용됩니다.

  • Functor는 매핑할 수 있는 유형입니다.
  • 모나드는 함수가 어떻게 적용될 수 있는지 정의하는 유형입니다.
// Simple Functor example (Array is a Functor)
const double = x => x * 2;
console.log([1, 2, 3].map(double)); // Output: [2, 4, 6]

// Simple Monad example (Promise is a Monad)
Promise.resolve(21)
  .then(double)
  .then(console.log); // Output: 42

결론

함수형 프로그래밍은 깔끔하고 유지 관리가 가능하며 견고한 코드를 작성하기 위한 강력한 도구 및 개념 세트를 제공합니다. 순수 함수, 불변성 및 우리가 탐구한 기타 핵심 원칙을 수용함으로써 추론하기가 더 쉽고 버그가 발생할 가능성이 적은 프로그램을 만들 수 있습니다.

기능적 사고방식에 적응하는 데 시간이 좀 걸릴 수 있지만, 특히 명령형 배경에서 온 경우 코드 품질과 개발자 생산성 측면에서 상당한 이점을 얻을 수 있습니다. 함수형 프로그래밍의 여정을 계속하면서 항상 모든 원칙을 엄격하게 준수하는 것이 아니라 이러한 개념을 이해하고 현명하게 적용하여 코드를 개선하는 것임을 기억하세요.

즐거운 함수형 프로그래밍을 즐겨보세요!

추가 자료

  • Frisby 교수의 함수형 프로그래밍에 대한 가장 적절한 안내서
  • Functional-Light JavaScript

위 내용은 함수형 프로그래밍의 기초의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.