Stellen Sie sich vor, wir möchten eine Reihe von Funktionen xgenau dann anwenden, wenn sie xnicht null sind:
if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);
Nehmen wir nun an, wir müssen dasselbe tun, um y:
if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);
Und das gleiche zu z:
if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);
Wie Sie ohne eine ordnungsgemäße Abstraktion sehen können, werden wir am Ende immer wieder Code duplizieren. Eine solche Abstraktion existiert bereits: die Vielleicht- Monade.
Die Vielleicht- Monade enthält sowohl einen Wert als auch einen rechnerischen Kontext:
- Die Monade schützt den Wert und wendet Funktionen darauf an.
- Der Rechenkontext ist eine Nullprüfung vor dem Anwenden einer Funktion.
Eine naive Implementierung würde folgendermaßen aussehen:
⚠️ Diese Implementierung dient nur zu Illustrationszwecken! Dies sollte nicht so gemacht werden und ist auf vielen Ebenen falsch. Dies sollte Ihnen jedoch eine bessere Vorstellung davon geben, wovon ich spreche.
Wie Sie sehen, kann nichts brechen:
- Wir wenden eine Reihe von Funktionen auf unseren Wert an
- Wenn der Wert zu irgendeinem Zeitpunkt null (oder undefiniert) wird, wenden wir einfach keine Funktion mehr an.
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>
Anhang 1
Ich kann nicht erklären, was Monaden sind, da dies nicht der Zweck dieses Beitrags ist und es Leute gibt, die dies besser können als ich. Wie Eric Elliot jedoch in seinem Blog-Beitrag sagte, wurden JavaScript-Monaden leicht gemacht :
Unabhängig von Ihrem Kenntnisstand oder Ihrem Verständnis der Kategorietheorie erleichtert die Verwendung von Monaden die Arbeit mit Ihrem Code. Wenn Sie Monaden nicht nutzen, kann es schwieriger sein, mit Ihrem Code zu arbeiten (z. B. Rückrufhölle, verschachtelte bedingte Zweige, mehr Ausführlichkeit).
Anlage 2
Hier ist, wie ich Ihr Problem mit dem lösen würde Vielleicht- Monade vonmonetjs
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..catchAnweisung. Das heißt, ein Array, das wild heterogene Elemente enthält, scheint mir ein Designproblem zu sein.