Bayangkan kita ingin menerapkan serangkaian fungsi ke xjika dan hanya jika xbukan nol:
if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);
Sekarang katakanlah kita perlu melakukan hal yang sama untuk y:
if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);
Dan sama untuk z:
if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);
Seperti yang Anda lihat tanpa abstraksi yang tepat, kami akan menggandakan kode berulang kali. Abstraksi seperti itu sudah ada: monad Maybe .
The Mungkin monad memegang kedua nilai dan konteks komputasi:
- Monad menjaga nilai tetap aman dan menerapkan fungsi padanya.
- Konteks komputasi adalah pemeriksaan nol sebelum menerapkan fungsi.
Penerapan yang naif akan terlihat seperti ini:
⚠️ Penerapan ini hanya untuk tujuan ilustrasi! Ini bukanlah bagaimana seharusnya dilakukan dan salah di banyak tingkatan. Namun ini akan memberi Anda gambaran yang lebih baik tentang apa yang saya bicarakan.
Seperti yang Anda lihat, tidak ada yang bisa pecah:
- Kami menerapkan serangkaian fungsi ke nilai kami
- Jika pada titik mana pun, nilainya menjadi null (atau tidak ditentukan), kami tidak lagi menerapkan fungsi apa pun.
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>
Lampiran 1
Saya tidak dapat menjelaskan apa itu monad karena ini bukan tujuan dari posting ini dan ada orang di luar sana yang lebih baik daripada saya. Namun seperti yang dikatakan Eric Elliot dalam posting blog sebelumnya, JavaScript Monads Made Simple :
Terlepas dari tingkat keahlian atau pemahaman Anda tentang teori kategori, menggunakan monad membuat kode Anda lebih mudah digunakan. Gagal memanfaatkan monad dapat membuat kode Anda lebih sulit untuk dikerjakan (misalnya, callback hell, cabang bersyarat bersarang, lebih banyak verbositas).
Lampiran 2
Inilah cara saya menyelesaikan masalah Anda menggunakan Mungkin monad frommonetjs
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..catchpernyataannya. Meskipun demikian, array yang berisi elemen heterogen yang liar terlihat seperti masalah desain bagi saya.