>  기사  >  웹 프론트엔드  >  JavaScript의 함수형 프로그래밍 소개: 모나드 수행 #12

JavaScript의 함수형 프로그래밍 소개: 모나드 수행 #12

WBOY
WBOY원래의
2024-07-18 11:04:21696검색

Introduction to Functional Programming in JavaScript: Do monads #12

함수형 프로그래밍에서 모나드는 구조화되고 예측 가능한 방식으로 계산을 처리하는 방법을 제공합니다. 다양한 모나드 중에서 Do 모나드("Do 표기법" 또는 "Monad comprehension"이라고도 함)는 모나드 연산을 더 읽기 쉽고 명령형 방식으로 처리할 수 있게 해주는 강력한 구조입니다.

Do 모나드는 무엇입니까?

Do Monad는 명령형 프로그래밍과 유사한 스타일로 모나드 연산 시퀀스를 작성할 수 있도록 하여 모나드 작업을 단순화하는 구문 설탕입니다. .then 또는 .FlatMap을 사용하여 작업을 연결하는 대신 Do Monad를 사용하면 더 간단하고 읽기 쉬운 코드를 작성할 수 있습니다.

Do 모나드의 장점

  1. 가독성: 복잡한 모나딕 연산을 깔끔하고 선형적인 방식으로 작성할 수 있습니다.
  2. 명령형 스타일: 명령형 프로그래밍에 익숙한 스타일로 모나드 계산을 표현하는 방법을 제공합니다.
  3. 오류 처리: 명확하고 일관된 구조를 제공하여 모나드 연산의 오류 처리를 단순화합니다.

JavaScript로 Do Monad 구현하기

JavaScript에는 Haskell과 같은 Do Monad에 대한 기본 지원이 없지만 생성기 함수와 사용자 정의 실행기를 사용하여 유사한 구성을 구현할 수 있습니다.

예: Do Monad Runner 구현하기

Promise 모나드를 처리할 수 있는 Do Monad 실행기를 구현하는 것부터 시작해 보겠습니다.

function* doGenerator() {
  const a = yield Promise.resolve(1);
  const b = yield Promise.resolve(2);
  const c = yield Promise.resolve(a + b);
  return c;
}

function runDo(genFunc) {
  const iter = genFunc();

  function handle(result) {
    if (result.done) return Promise.resolve(result.value);
    return Promise.resolve(result.value).then(res => handle(iter.next(res)));
  }

  return handle(iter.next());
}

// Usage
runDo(doGenerator).then(result => console.log(result)); // 3

이 예에서 doGenerator는 Promise를 생성하는 생성기 함수입니다. runDo 함수는 생성기를 실행하여 생성된 각 Promise를 처리하고 확인된 값을 다시 생성기로 전달합니다.

Do 모나드의 실제 적용

Do Monad는 읽기 쉽고 유지 관리 가능한 방식으로 모나드 작업의 순서를 지정해야 하는 다양한 시나리오에서 사용할 수 있습니다.

예: 비동기 작업 처리

더 복잡한 비동기 작업을 처리하도록 이전 예제를 향상해 보겠습니다.

function* fetchUserData() {
  const user = yield fetch('https://api.example.com/user/1').then(res => res.json());
  const posts = yield fetch(`https://api.example.com/user/${user.id}/posts`).then(res => res.json());
  const firstPost = posts[0];
  const comments = yield fetch(`https://api.example.com/posts/${firstPost.id}/comments`).then(res => res.json());
  return { user, firstPost, comments };
}

runDo(fetchUserData).then(result => console.log(result));

이 예에서 fetchUserData는 사용자 데이터, 게시물 및 첫 번째 게시물의 댓글을 가져오기 위한 약속을 생성하는 생성기 함수입니다. runDo 함수는 읽기 쉽고 구조화된 방식으로 이러한 비동기 작업을 실행합니다.

예: Maybe Monad로 선택적 값 처리하기

Maybe와 같은 다른 모나드와 함께 Do Monad 패턴을 사용할 수도 있습니다.

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

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

  map(fn) {
    return this.value === null || this.value === undefined ? Maybe.of(null) : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.value === null || this.value === undefined ? Maybe.of(null) : fn(this.value);
  }
}

function* maybeDoGenerator() {
  const a = yield Maybe.of(1);
  const b = yield Maybe.of(2);
  const c = yield Maybe.of(a + b);
  return c;
}

function runMaybeDo(genFunc) {
  const iter = genFunc();

  function handle(result) {
    if (result.done) return Maybe.of(result.value);
    return result.value.flatMap(res => handle(iter.next(res)));
  }

  return handle(iter.next());
}

// Usage
const result = runMaybeDo(maybeDoGenerator);
console.log(result); // Maybe { value: 3 }

이 예에서 MaybeDoGenerator는 Maybe 모나드와 함께 작동하는 생성기 함수입니다. runMaybeDo 함수는 생성기를 실행하여 생성된 각각의 Maybe 값을 처리하고 래핑되지 않은 값을 다시 생성기로 전달합니다.

Do Monad는 더 읽기 쉽고 명령적인 스타일로 모나드 연산 시퀀스를 작성할 수 있게 하여 모나드 작업을 단순화하는 강력한 구조입니다. Do Monad 실행기를 구현하면 구조화되고 유지 관리 가능한 방식으로 복잡한 비동기 작업, 선택적 값 및 기타 모나드 계산을 처리할 수 있습니다.

JavaScript는 기본적으로 Do Monad 구문을 지원하지 않지만 생성기 함수와 사용자 정의 실행기를 사용하면 비슷한 기능을 얻을 수 있습니다. 이 접근 방식은 코드의 가독성과 유지 관리성을 향상시켜 함수형 프로그래밍 스타일로 모나딕 작업을 더 쉽게 수행할 수 있게 해줍니다.

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

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