Sissejuhatus
Sageli on muutmata jätmist raske säilitada. Pakkimise muster andmed konteinerisse tuleb appi. See kindlustab väärtused nii, et nende käitlemine on ohutu, välistades kõrvalmõjud.
Kui te olete siin uus, siis vaadake kindlasti minu viimased 2 osa funktsionaalse programmeerimise kohta aadressil The Codest blogi kohta:
Funktsioon
Sellel ei ole keerulist loogikat. Selle peamine ülesanne on pakendada kontekst ja täita funktsioone, mida ta väljastpoolt saab. Iga kord, kui väärtus muutub, pakitakse uus konteineri instants ümber ja tagastatakse. Kui kutsutakse välja kaart meetod, mis võtab vastu konkreetse tegevuse, tagastab ta uue konteineri eksemplari, mille väärtus tagastatakse üleantud funktsiooniga, säilitades samal ajal mittemuudetava põhimõtte.
Deklaratsioon
const Functor = value => ({
map: fn => Functor(fn(value)),
chain: fn => fn(value),
of: () => value
});
kaart - kasulik, kui soovite muuta konteineri väärtuse olekut, kuid ei soovi seda veel tagastada.
kett - kasutatakse siis, kui soovite funktsiooni väärtust edasi anda ilma konteineri olekut muutmata. Tavaliselt on lõpus kaart kõned.
aadressilt - tagastab praeguse väärtuse
Imperatiivne näide
const randomInt = (max) => Math.floor(Math.random() * (max + 1))
const randomNumber = randomInt(200) // tagastab arvu 0 ja 200 vahel.
decrease(randomNumber) // tagastab (arvu vahemikus 0 ja 200) - 1
Deklaratiivne näide
const randomIntWrapper = (max) =>
Functor(max)
.map(increase) // max + 1
.map(multiplyBy(Math.random())) // Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))
const randomNumber = randomIntWrapper(200)
randomNumber.of() // tagastab arvu vahemikus 0 ja 200
randomNumber.chain(decrease) // tagastab (arvu vahemikus 0 ja 200) - 1
Monaadi
Mõnikord on lisaks funktsioonidele, mis käivitavad väärtuse uue oleku, vaja konteinerisse peidetud lisaloogikat. Siinkohal tuleb monad kasuks, kuna see on laiendus functor. See võib näiteks otsustada, mis peaks toimuma, kui väärtus on teatud väärtusega või millise tee järgmised tegevused peaksid võtma.
Monaadi võib-olla
Monaad võib-olla lahendab väärtuste probleemi, mis ei tagasta tõene. Kui see juhtub, siis järgnevad kaart kutsed ignoreeritakse, kuid see võimaldab tagastada alternatiivse kutsega getOr meetod. See võimaldab vältida if / else operaatorite kasutamist, mis on populaarsed in imperatiiv programmeerimine. See monaad koosneb kolmest konteinerist:
Mitte midagi - käivitub, kui konteinerisse satub väärtus, mis ei ole tõsi, või filter meetod tagastab false. Seda kasutatakse funktsiooni täitmise simuleerimiseks. See tähendab, et see konteiner võtab funktsiooni vastu, kuid ei täida seda.
Lihtsalt - see on peamine konteiner, mis täidab kõiki funktsioone, kuid kui väärtus muutub valeks või filter meetod tagastab false, siis edastab ta selle meetodi Mitte midagi konteiner.
Võib-olla - Võtan algväärtuse ja otsustan, millist konteinerit alguses kutsuda.
Deklaratsioon
const Just = value => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => value,
filter: fn => fn(value) ? Just(value) : Nothing(),
type: 'lihtsalt'
});
const Nothing = () => ({
map: fn => Nothing(),
chain: fn => fn(),
of: () => Nothing(),
getOr: substitute => substitute,
filter: () => Nothing(),
type: 'nothing'
});
const Maybe = value =>
value === null || value === undefined || value.type === 'nothing'
? Nothing()
: Just(value)

Nüüd ehitame eelmise näite tingimuse kohta. Kui max on suurem kui null, siis täidetakse funktsioon. Vastasel juhul tagastab see 0.
Imperatiivne näide
const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} else {
return 0
}
}
const bookMiddlePage = 200
const randomPage = randomInt(10) || bookMiddlePage // tagastab juhusliku väärtuse.
const randomPage = randomInt(-10) || bookMiddlePage // tagastab 200
Deklaratiivne näide
const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // väärtus false ignoreerib edasisi kõnesid.
.map(increase)
.map(multiplyBy(Math.random()))
.map(Math.floor)
const bookMiddlePage = 200
// Lihtsalt konteiner
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // tagastab juhuslikkuse
// Miski konteiner
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // tagastab 200
