>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 함수형 프로그래밍 소개: 모나드와 펑터 #7

JavaScript의 함수형 프로그래밍 소개: 모나드와 펑터 #7

WBOY
WBOY원래의
2024-07-18 09:41:19761검색

Introduction to Functional Programming in JavaScript: Monad and functors #7

모나드와 펑터는 데이터 변환, 부작용 및 합성을 처리하기 위한 강력한 추상화를 제공하는 함수형 프로그래밍의 고급 개념입니다. 수학의 범주 이론에서 유래했지만 JavaScript와 같은 프로그래밍 언어에 실용적으로 적용됩니다.

펑터란 무엇입니까?

Functor는 functor 내부의 값에 함수를 적용하고 변환된 값으로 새로운 functor를 반환하는 map 메소드를 구현한 데이터 유형입니다. 본질적으로 펑터를 사용하면 컨테이너의 구조를 변경하지 않고도 래핑된 값에 함수를 적용할 수 있습니다.

펑터의 예
class Box {
  constructor(value) {
    this.value = value;
  }

  map(fn) {
    return new Box(fn(this.value));
  }
}

// Usage
const box = new Box(2);
const result = box.map(x => x + 3).map(x => x * 2);
console.log(result); // Box { value: 10 }

이 예에서 Box는 펑터입니다. map 메소드는 상자 내부의 값에 fn 함수를 적용하고 변환된 값으로 새 Box를 반환합니다.

모나드란 무엇입니까?

모나드는 of(일부 언어에서는 return)와 flatMap(바인드 또는 체인이라고도 함)이라는 두 가지 추가 메서드를 구현하는 펑터 유형입니다. 모나드는 모나드의 컨텍스트를 유지하면서 포함된 값에 대한 작업을 연결하는 방법을 제공합니다.

모나드의 속성
  1. Unit(of): 값을 가져와 해당 값이 포함된 모나드를 반환하는 메서드입니다.
  2. 바인드(플랫맵): 모나드를 반환하는 함수를 가져와 포함된 값에 적용하여 결과를 평면화하는 메서드입니다.
모나드의 예
class Box {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Box(value);
  }

  map(fn) {
    return Box.of(fn(this.value));
  }

  flatMap(fn) {
    return fn(this.value);
  }
}

// Usage
const box = Box.of(2);
const result = box
  .flatMap(x => Box.of(x + 3))
  .flatMap(x => Box.of(x * 2));
console.log(result); // Box { value: 10 }

이 예에서 Box는 펑터이자 모나드입니다. of 메소드는 Box에 값을 래핑하고 flatMap 메소드는 포함된 값에 함수를 적용하고 결과 모나드를 반환합니다.

모나드와 펑터의 실제 사용 사례

모나드와 펑터는 단순한 이론적 구성이 아닙니다. 실제 프로그래밍에 실용적으로 적용됩니다. 몇 가지 일반적인 사용 사례를 살펴보겠습니다.

Maybe Monad로 선택적 값 처리하기

Maybe 모나드는 선택적 값을 처리하고 null 또는 정의되지 않은 값을 방지하며 안전한 연결 작업 방법을 제공하는 데 사용됩니다.

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  isNothing() {
    return this.value === null || this.value === undefined;
  }

  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
}

// Usage
const maybeValue = Maybe.of('hello')
  .map(str => str.toUpperCase())
  .flatMap(str => Maybe.of(`${str} WORLD`));
console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }

이 예에서 Maybe 모나드는 선택적 값을 안전하게 처리하여 값이 null이 아니거나 정의되지 않은 경우에만 변환을 허용합니다.

Promise Monad로 비동기 작업 처리하기

JavaScript의 Promise는 비동기 작업을 처리하는 모나드로서 작업을 연결하고 오류를 처리하는 방법을 제공합니다.

const fetchData = url => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

// Usage
fetchData('https://api.example.com')
  .then(data => {
    console.log(data); // 'Data from https://api.example.com'
    return fetchData('https://api.example.com/2');
  })
  .then(data => {
    console.log(data); // 'Data from https://api.example.com/2'
  })
  .catch(error => {
    console.error(error);
  });

Promise를 사용하면 깔끔하고 구성 가능한 방식으로 비동기 작업을 처리하고 작업을 연결하고 오류를 정상적으로 처리할 수 있습니다.

모나드와 펑터는 보다 구조화되고 예측 가능한 방식으로 데이터 변환, 부작용 및 구성 작업을 수행할 수 있게 해주는 함수형 프로그래밍의 강력한 추상화입니다.

모나드와 펑터의 수학적 기초는 복잡할 수 있지만 실제 프로그래밍에서는 실제 적용이 매우 중요합니다. Maybe 모나드로 선택적 값을 처리하든, Promise로 비동기 작업을 관리하든, 이러한 함수형 프로그래밍 기술은 더욱 강력하고 안정적인 애플리케이션을 만드는 데 도움이 될 수 있습니다.

위 내용은 JavaScript의 함수형 프로그래밍 소개: 모나드와 펑터 #7의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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