Ósamhliða og einþráða JavaScript?
JavaScript er einþráða forritunarmál og jafnframt óblokkandi, ósamhverft og samhliða. Í þessari grein verður útskýrt hvernig það gerist.
Skoðaðu þriðja hluta greinaseríunnar okkar "Power of functional programming in JavaScript". Að þessu sinni útskýrir sérfræðingur okkar í JavaScript nánar um Functor og Monad Maybe.
Hér er tómt.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:
Þ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ð.
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
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
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
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 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.
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.
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
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