(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); Functional forritun í JavaScript, hluti 3 – Functor og Monad Maybe – The Codest
The Codest
  • Um okkur
  • Þjónusta
    • Hugbúnaðarþróun
      • Framhliðþróun
      • Bakendaþróun
    • Staff Augmentation
      • Framhliðaráþrófarar
      • Bakhliðaráþróunaraðilar
      • Gagnaverkfræðingar
      • Skýjaverkfræðingar
      • Gæðatryggingartæknimenn
      • Annað
    • Það er ráðgjafi
      • Endurskoðun og ráðgjöf
  • Iðnaðargreinar
    • Fjártæknifyrirtæki og bankastarfsemi
    • E-commerce
    • Adtech
    • Heilbrigðistækni
    • Framleiðsla
    • Flutningar
    • Bifreiða
    • Internet hlutanna
  • Gildi fyrir
    • CEO
    • CTO
    • Afhendingarstjóri
  • Teymið okkar
  • Case Studies
  • Vitið hvernig
    • Blogg
    • Fundir
    • Vefnámskeið
    • Auðlindir
Starfsferilmöguleikar Hafðu samband
  • Um okkur
  • Þjónusta
    • Hugbúnaðarþróun
      • Framhliðþróun
      • Bakendaþróun
    • Staff Augmentation
      • Framhliðaráþrófarar
      • Bakhliðaráþróunaraðilar
      • Gagnaverkfræðingar
      • Skýjaverkfræðingar
      • Gæðatryggingartæknimenn
      • Annað
    • Það er ráðgjafi
      • Endurskoðun og ráðgjöf
  • Gildi fyrir
    • CEO
    • CTO
    • Afhendingarstjóri
  • Teymið okkar
  • Case Studies
  • Vitið hvernig
    • Blogg
    • Fundir
    • Vefnámskeið
    • Auðlindir
Starfsferilmöguleikar Hafðu samband
Aftur ör Farðu aftur
2022-06-21
Hugbúnaðarþróun

Functional forritun í JavaScript, hluti 3 – Functor og Monad Maybe

The Codest

Pawel Ged

Vue.js forritari

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.

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:

  • Kafli 1 – Inngangur
  • 2. hluti – Samsetjendur

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)
fallbiliðferðir borðs

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


samstarfsfáninn

Tengdar greinar

Hugbúnaðarþróun

Ó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.

Lukasz Kolko
Hugbúnaðarþróun

Öryggisvandamál á netinu: Gagnaleki

Framundan jólin er í fullum gangi. Í leit að gjöfum fyrir ástvini sína eru menn sífellt reiðubúnari til að “rjúka” inn í netverslanir.

The Codest
Jakub Jakubowicz CTO og meðstofnandi

Gerðu þig áskrifanda að þekkingargrunni okkar og vertu upplýstur um sérfræðiþekkingu upplýsingatæknigeirans.

    Um okkur

    The Codest – Alþjóðlegt hugbúnaðarþróunarfyrirtæki með tæknimiðstöðvar í Póllandi.

    Bretland - Höfuðstöðvar

    • Skrifstofa 303B, 182-184 High Street North E6 2JA
      Lundúnir, England

    Pólland - staðbundin tæknimiðstöðvar

    • Fabryczna skrifstofugarður, Aleja
      Herbergi 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Varsjá, Pólland

    The Codest

    • Heim
    • Um okkur
    • Þjónusta
    • Case Studies
    • Vitið hvernig
    • Starfsferilmöguleikar
    • Orðabók

    Þjónusta

    • Það er ráðgjafi
    • Hugbúnaðarþróun
    • Bakendaþróun
    • Framhliðþróun
    • Staff Augmentation
    • Bakhliðaráþróunaraðilar
    • Skýjaverkfræðingar
    • Gagnaverkfræðingar
    • Annað
    • Gæðatryggingartæknimenn

    Auðlindir

    • Staðreyndir og goðsagnir um samstarf við utanaðkomandi hugbúnaðarþróunaraðila
    • Frá Bandaríkjunum til Evrópu: Af hverju ákveða bandarísk sprotafyrirtæki að flytja til Evrópu?
    • Samanburður á tæknifjarkerfisþróunarmiðstöðvum: Tech Offshore Europe (Pólland), ASEAN (Filippseyjar), Eurasia (Tyrkland)
    • Hvert eru helstu áskoranir CTO-a og CIO-a?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Höfundarréttur © 2026 af The Codest. Öll réttindi áskilin.

    is_ISIcelandic
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lvLatvian lt_LTLithuanian is_ISIcelandic