펑터, 모나드, 프라미스

10528 단어 promisejavascript
JavaScript Promise는 비동기 작업을 위한 도구입니다. 그러나 그것은 그보다 훨씬 더 강력합니다.

Promise의 then 메서드는 map과 flatMap과 같은 역할을 한다고 생각할 수 있습니다.

배열, 맵, flatMap, 펑터, 모나드



JavaScript 배열에서 map를 사용하면 배열을 가져오고 각 요소가 완전히 변환된 완전히 새로운 배열을 얻을 수 있음을 기억하십시오. 즉, map는 배열(암시적으로)인 함수를 취하고 다른 배열을 반환합니다.

따라서 예를 들어 숫자 배열에서 문자열 배열을 파생시키려면 함수를 제공하여 map 메서드를 호출합니다.

여기 예가 있습니다.

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

const strs = nums.map(n => n.toString());

// Should be:
// [ '1', '2', '3', '4', '5' ]


배열은 map 메서드를 구현하므로 배열을 펑터로 생각할 수 있습니다.

배열은 flatMap 메서드도 구현합니다. map 와 마찬가지로 완전히 새로운 배열을 파생시키는 데에도 사용됩니다. 그러나 여기서 중요한 차이점은 제공된 함수가 변환된 값을 반환하는 대신 배열 내부에 래핑된 값을 반환할 수 있다는 것입니다.

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

const strs = nums.flatMap(n => [ n.toString() ]);
// Note: we're returning an ARRAY with a single string!

// Should be:
// [ '1', '2', '3', '4', '5' ]


궁금한 점이 있으면 반환된 배열에는 절대적으로 둘 이상의 요소가 포함될 수 있습니다. 이러한 값은 단순히 최종 결과에 연결됩니다.

배열은 flatMap를 구현하므로 배열을 모나드로 생각할 수 있습니다.

펑터와 모나드에 대하여



펑터와 모나드는 가치를 지닌 두 가지 구조입니다.

펑터는 map를 구현하고 모나드는 flatMap를 구현합니다.

펑터와 모나드는 엄격하게 1, 2, 3 또는 무제한에 관계없이 임의의 수의 값을 보유하도록 정의할 수 있습니다.

펑터와 모나드로서의 약속



JavaScript 약속은 단일 값을 보유하는 구성을 나타냅니다.

약속의 then 메서드는 mapflatMap 의 역할을 모두 수행합니다.
thenmap 와 같은 flatMap 메서드는 항상 약속을 반환합니다.
then 를 사용하면 함수가 약속이 아닌 값을 반환하도록 할 수 있습니다. 이것은 then 배열의 map 메서드처럼 작동합니다. 또는 해당 함수가 약속을 반환하도록 할 수 있습니다. 이것은 then 배열의 flatMap 메서드처럼 작동합니다.

다음은 thenmap 처럼 작동합니다.

promise.then((x) => {
  return x + 42;
});


다음은 thenflatMap 처럼 작동합니다.

promise.then((x) => {
  // Note: Promise.resolve will return a promise.
  return Promise.resolve(x + 42);
});


약속이 있는 모나드 법칙



모나드는 laws . 그것들을 뉴턴의 세 가지 운동 법칙처럼 생각하십시오.

이것들은:
  • 왼쪽 덴티
  • 권리 아이덴티티
  • 연관성

  • Promise는 모나드로 해석될 수 있으므로 then를 사용하여 세 가지 법칙을 따를 수 있습니다.

    보여줍시다. 먼저 f, g 함수가 값을 받아 Promise를 반환하고 p가 Promise라고 가정해보자.

    왼쪽 ID




    Promise.resolve(x).then(f)
    
    // Is equivalent to
    
    f(x)
    


    오른쪽 ID




    p.then(Promise.resolve)
    
    // Is equivalent to
    
    p // I'm serious. that's all there is to it.
    


    연관성




    p.then(x => f(x).then(g))
    
    // Is equivalent to
    
    p.then(f).then(g)
    


    Promise의 모나딕 오류 처리



    전통적으로 flatMap (약속의 then)은 매우 인스턴스에 따라 다릅니다. 결국 인스턴스가 모나드처럼 작동하는 한 이름flatMap을 원하는 이름으로 대체할 수 있습니다. 그리고 promise의 경우 flatMapthen 라고 합니다.
    then 대신 flatMap 라는 이름을 제외하고 구현 방식은 인스턴스마다 다를 수 있습니다.

    그리고 Promise의 경우 Promise가 오류 이외의 값을 보유하지 않으면 then가 평가하지 않도록 구현할 수 있습니다.

    예를 들어

    Promise.reject(new Error('Some error'))
      .then(() => {
        console.log('Wee!');
        // Trust me. Nothing will happen here.
      });
    


    Promise로 무엇이든 하려면 catch 메서드를 호출해야 합니다. catch 메서드는 then 처럼 약속을 반환합니다.

    그러나 then는 약속에 값이 있는 경우에만 함수를 평가하지만 catch는 약속에 오류가 있는 경우 함수를 평가합니다.

    Promise.reject(new Error('Some error'))
      .then(() => {
        console.log('Wee!');
        // Trust me. Nothing will happen here.
    
        return Promise.resolve(1);
      })
      .catch(() => {
        console.log('Caught an error!')
        return Promise.resolve(42);
      })
      .then(x => {
        console.log(x);
        // Will log 42, not 1.
      });
    


    흥미롭게도 모나드 법칙은 catchthen 에서도 작동합니다.

    결론



    그래서 이 글은 모나드가 무엇인지, 그리고 어떻게 프로미스가 모나드로 생각될 수 있는지에 대해 다루었습니다. 간단히 말해서 flatMap 와 같은 메서드를 구현하는 한 개체는 모나드로 생각할 수 있습니다.

    좋은 웹페이지 즐겨찾기