"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JavaScript의 함수형 프로그래밍 소개: 모나드와 펑터 #7

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

2024-07-29에 게시됨
검색:594

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

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

펑터란 무엇입니까?

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

펑터의 예
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. Bind (FlatMap): 모나드를 반환하는 함수를 가져와 포함된 값에 적용하여 결과를 평면화하는 메서드입니다.
모나드의 예
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의 프라미스는 비동기 작업을 처리하는 모나드로서 작업을 연결하고 오류를 처리하는 방법을 제공합니다.

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);
  });

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

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

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

릴리스 선언문 이 기사는 https://dev.to/francescoagati/introduction-to-functioning-programming-in-javascript-monad-and-functors-7-1l6l?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3