Inngangur
Oft er erfitt að viðhalda óbreytanlegu ástandi. Mynstur umbúðarinnar gögn Ílátið kemur til bjargar. Það tryggir gildin svo meðhöndlun þeirra sé örugg og aukaverkanir útilokaðar.
Ef þú ert nýr hér skaltu ganga úr skugga um að skoða síðustu tvo hluta mína um virkniforritun á The Codest Blogg um:
Funktor
Það hefur enga flókna rökfræði. Aðalverkefni þess er að umlykja samhengi og framkvæma þær aðgerðir sem það fær frá utanaðkomandi á því. Í hvert sinn sem gildið breytist er ný eining af íláti endurpakkuð og skiluð. Þegar kallað er á kort aðferð sem framkvæmir tiltekna aðgerð skilar nýrri ílátseiningu með gildinu sem skilað var af færðu falli, á sama tíma og óbreytanleikareglunni er haldið.
Yfirlýsing
const Functor = value => ({
map: fn => Functor(fn(value)),
chain: fn => fn(value),
of: () => value
});Hljóðskrift
kort – gagnlegt þegar þú vilt breyta ástandi gildis í íláti en vilt ekki skila því ennþá.
keðja – notað þegar þú vilt senda gildi í fall án þess að breyta ástandi ílátsins. Venjulega í lokin af kort símtöl.
af – skila núverandi gildi
Hvortvísunardæmi
const randomInt = (max) => Math.floor(Math.random() * (max + 1))
const randomNumber = randomInt(200) // skilar tölunni á bilinu 0 til 200
decrease(randomNumber) // skilar (tölu á bilinu 0 til 200) - 1
Yfirlýsingardæmi
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() // skilar tölunni á milli 0 og 200
randomNumber.chain(decrease) // skilar (tölu á milli 0 og 200) - 1
Monadí
Stundum, auk þeirra aðgerða sem kveikja á nýju ástandi gildisins, þarftu viðbótar rökhugsun falna í ílátinu. Hér kemur monad sér vel, þar sem það er viðbót við fall. Það getur til dæmis ákveðið hvað eigi að gerast þegar gildið er ákveðið eða hvaða leið næstu aðgerðir skuli fara.
Monad Kannski
Monad leysir kannski vandamálið með gildi sem skila ekki sönnu. Þegar þetta gerist, næstu kort Áköll eru hunsuð, en það gerir þér kleift að skila vali með því að hringja í fá eða aðferð. Hún gerir þér kleift að forðast notkun if/else-skilyrða, sem eru vinsæl í boðháttur forritun. Þessi monad samanstendur af þremur ílátum:
Ekkert – keyrir þegar gildi sem er ekki satt lendir í ílátinu eða síu Aðferðin skilar false. Hún er notuð til að herma eftir keyrslu falls. Þetta þýðir að þessi íhlutur fær fallið en keyrir það ekki.
Bara – þetta er aðalílátið sem sinnir öllum aðgerðum, en ef gildið breytist í falskt gildi eða síu aðferðin skilar false, hún mun senda það til Ekkert ílát.
Kannski – Ég tek upphafsgildið og ákveð hvaða ílát ég kalla á í upphafi.
Yfirlýsing
const Just = value => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => value,
filter: fn => fn(value) ? Just(value) : Nothing(),
type: 'just'
});
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ú skulum við byggja á fyrri dæminu um skilyrðið. Ef max er stærra en núll, verður fallið keyrt. Annars skilar það 0.
Hvortvísunardæmi
const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} else {
return 0
}
}
const bookMiddlePage = 200
const randomPage = randomInt(10) || bookMiddlePage // skilar handahófskenndu
const randomPage = randomInt(-10) || bookMiddlePage // skilar 200
Yfirlýsingardæmi
const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // false-gildi hunsar frekari köll
.map(increase)
.map(multiplyBy(Math.random()))
.map(Math.floor)
const bookMiddlePage = 200
// Einungis íláti
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // skilar handahófskennt
// Tómt íláti
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // skilar 200
