펑터, 모나드, 프라미스
10528 단어 promisejavascript
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
메서드는 map
및 flatMap
의 역할을 모두 수행합니다.then
및 map
와 같은 flatMap
메서드는 항상 약속을 반환합니다.then
를 사용하면 함수가 약속이 아닌 값을 반환하도록 할 수 있습니다. 이것은 then
배열의 map
메서드처럼 작동합니다. 또는 해당 함수가 약속을 반환하도록 할 수 있습니다. 이것은 then
배열의 flatMap
메서드처럼 작동합니다.다음은
then
가 map
처럼 작동합니다.promise.then((x) => {
return x + 42;
});
다음은
then
가 flatMap
처럼 작동합니다.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의 경우 flatMap
는 then
라고 합니다.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.
});
흥미롭게도 모나드 법칙은
catch
와 then
에서도 작동합니다.결론
그래서 이 글은 모나드가 무엇인지, 그리고 어떻게 프로미스가 모나드로 생각될 수 있는지에 대해 다루었습니다. 간단히 말해서
flatMap
와 같은 메서드를 구현하는 한 개체는 모나드로 생각할 수 있습니다.
Reference
이 문제에 관하여(펑터, 모나드, 프라미스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/manlycoffee/functors-monads-and-promises-4hb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)