null이 아닌 x경우에만 일련의 함수를 적용한다고 상상해보십시오 x.
if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);
이제 다음과 같은 작업을 수행해야한다고 가정 해 보겠습니다 y.
if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);
그리고 동일 z:
if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);
적절한 추상화없이 볼 수 있듯이 우리는 코드를 계속해서 복제하게 될 것입니다. 그러한 추상화는 이미 존재합니다 : Maybe 모나드.
어쩌면 모나드는 값과 계산 컨텍스트를 모두 수신을 원하는 분야
- 모나드는 값을 안전하게 유지하고 함수를 적용합니다.
- 계산 컨텍스트는 함수를 적용하기 전에 null 검사입니다.
순진한 구현은 다음과 같습니다.
⚠️이 구현은 단지 설명을위한 것입니다! 이것은 그것이 행해지는 방법이 아니며 여러 단계에서 잘못되었습니다. 그러나 이것은 내가 말하는 것에 대한 더 나은 아이디어를 줄 것입니다.
보시다시피 아무것도 깨질 수 없습니다.
- 우리는 가치에 일련의 기능을 적용합니다.
- 어떤 시점에서 값이 null (또는 정의되지 않음)이되면 더 이상 함수를 적용하지 않습니다.
const abc = obj =>
Maybe
.of(obj)
.map(o => o.a)
.map(o => o.b)
.map(o => o.c)
.value;
const values = [
{},
{a: {}},
{a: {b: {}}},
{a: {b: {c: 42}}}
];
console.log(
values.map(abc)
);
<script>
function Maybe(x) {
this.value = x; //-> container for our value
}
Maybe.of = x => new Maybe(x);
Maybe.prototype.map = function (fn) {
if (this.value == null) { //-> computational context
return this;
}
return Maybe.of(fn(this.value));
};
</script>
부록 1
모나드는이 포스트의 목적이 아니고 저보다 더 잘하는 사람들이 있기 때문에 설명 할 수 없습니다. 그러나 Eric Elliot이 hist 블로그 게시물 JavaScript Monads Made Simple 에서 말했듯이 :
기술 수준이나 범주 이론에 대한 이해와 관계없이 모나드를 사용하면 코드 작업이 더 쉬워집니다. 모나드를 활용하지 못하면 코드 작업이 더 어려워 질 수 있습니다 (예 : 콜백 지옥, 중첩 된 조건부 분기, 더 자세한 정보).
부록 2
다음을 사용하여 문제를 해결하는 방법은 다음과 같습니다. Maybe 모나드를 입니다.monetjs
const prop = key => obj => Maybe.fromNull(obj[key]);
const abc = obj =>
Maybe
.fromNull(obj)
.flatMap(prop('a'))
.flatMap(prop('b'))
.flatMap(prop('c'))
.orSome('🌯')
const values = [
{},
{a: {}},
{a: {b: {}}},
{a: {b: {c: 42}}}
];
console.log(
values.map(abc)
);
<script src="https://www.unpkg.com/monet@0.9.0/dist/monet.js"></script>
<script>const {Maybe} = Monet;</script>
try..catch명령문을 사용해보십시오 . 즉, 이질적인 요소를 포함하는 배열은 디자인 문제처럼 보입니다.