Boş xdeğilse ve ancak xboş değilse bir dizi işlevi uygulamak istediğimizi düşünün :
if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);
Şimdi de şunu yapmamız gerektiğini söyleyelim y:
if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);
Ve aynı şey z:
if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);
Düzgün bir soyutlama olmadan görebileceğiniz gibi, sonunda kodu tekrar tekrar çoğaltacağız. Böyle bir soyutlama zaten var: Belki monad.
Belki monad bir değeri ve bir hesaplama bağlamı hem tutar:
- Monad değeri güvende tutar ve ona işlevler uygular.
- Hesaplama bağlamı, bir işlevi uygulamadan önce boş bir kontroldür.
Saf bir uygulama şöyle görünür:
⚠️ Bu uygulama yalnızca örnekleme amaçlıdır! Bu nasıl yapılması gerektiği değildir ve birçok düzeyde yanlıştır. Ancak bu, neden bahsettiğim hakkında size daha iyi bir fikir verecektir.
Gördüğünüz gibi hiçbir şey bozulamaz:
- Değerimize bir dizi işlev uygularız
- Herhangi bir noktada, değer boş (veya tanımsız) olursa, artık herhangi bir işlevi uygulamıyoruz.
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>
ek 1
Monadların ne olduğunu açıklayamam çünkü bu yazının amacı bu değil ve bunda benden daha iyi insanlar var. Ancak Eric Elliot'ın eski blog gönderisinde söylediği gibi JavaScript Monads Made Simple :
Beceri seviyeniz veya kategori teorisi anlayışınız ne olursa olsun, monad kullanmak kodunuzun daha kolay çalışmasını sağlar. Monadlardan yararlanamamak, kodunuzun çalışmasını zorlaştırabilir (örneğin, geri arama cehennemi, iç içe geçmiş koşullu dallar, daha fazla ayrıntı).
Ek 2
İşte kullanarak sorununuzu çözmek istiyorum nasıl Belki :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..catchifadeyi deneyin . Bununla birlikte, çılgınca heterojen öğeler içeren bir dizi bana bir tasarım sorunu gibi görünüyor.