window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versjon: 2, } ;(function () { var w = vindu if (w.LeadBooster) { console.warn('LeadBooster finnes allerede') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Funksjonell programmering i JavaScript Del 3 - Funktor og monade Maybe - The Codest
The Codest
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Industrier
    • Fintech og bankvirksomhet
    • E-commerce
    • Adtech
    • Helseteknologi
    • Produksjon
    • Logistikk
    • Bilindustrien
    • IOT
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
Pil tilbake GÅ TILBAKE
2022-06-21
Programvareutvikling

Funksjonell programmering i JavaScript Del 3 - Funktor og monade Maybe

The Codest

Pawel Ged

Vue.js-utvikler

Sjekk den tredje delen av vår artikkelserie Power of functional programming in JavaScript. Denne gangen forklarer vår JavaScript-ekspert mer om Functor og Monad Maybe.

Innledning

Ofte er det vanskelig å vedlikeholde det som ikke kan endres. Mønsteret med å pakke inn data i en container kommer til unnsetning. Det sikrer verdiene slik at det er trygt å håndtere dem uten at det oppstår bivirkninger.

Hvis du er ny her, må du huske å sjekke de to siste delene mine om funksjonell programmering på The Codest-bloggen om:

  • Del 1 - Innledning
  • Del 2 - Kombinatorer

Funktor

Den har ingen kompleks logikk. Hovedoppgaven er å pakke inn konteksten og utføre funksjonene den mottar fra utsiden på dem. Hver gang verdien endres, pakkes en ny containerinstans inn på nytt og returneres. Når du kaller kart som krever en bestemt handling, returnerer den en ny containerforekomst med verdien som returneres av den overførte funksjonen, samtidig som prinsippet om ikke-modifiserbarhet opprettholdes.

Erklæring

 const Functor = value => ({
     map: fn => Functor(fn(verdi)),
     chain: fn => fn(verdi),
     of: () => value
 });

kart - nyttig når du vil endre tilstanden til en verdi i en container, men ikke ønsker å returnere den ennå.

kjede - brukes hvis du vil sende en verdi til en funksjon uten å endre beholderens tilstand. Vanligvis på slutten av kart samtaler.

av - returnere gjeldende verdi

Imperativt eksempel

const randomInt = (max) => Math.floor(Math.random() * (max + 1))

const randomNumber = randomInt(200) // returnerer et tall mellom 0 og 200

decrease(randomNumber) // returnerer (tall mellom 0 og 200) - 1

Deklarativt eksempel

const randomIntWrapper = (max) => (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() // returnerer tall mellom 0 og 200
randomNumber.chain(decrease) // returnerer (tall mellom 0 og 200) - 1

Monade

I tillegg til funksjonene som utløser den nye tilstanden til verdien, trenger du noen ganger ytterligere logikk skjult i beholderen. Det er her monad kommer til nytte, ettersom det er en utvidelse av funktor. Den kan for eksempel bestemme hva som skal skje når verdien har en viss verdi, eller hvilken vei de neste handlingene skal ta.

Monade Kanskje

Monaden løser kanskje problemet med verdier som ikke returnerer true. Når dette skjer, vil påfølgende kart anrop ignoreres, men du kan returnere et alternativ ved å kalle getOr metoden. Det gjør at du unngår bruk av if/ else-operatorer, som er populære i tvingende nødvendig programmering. Denne monaden består av tre beholdere:

Ingenting - kjøres når en verdi som ikke er sann, faller inn i beholderen eller filter metoden returnerer false. Den brukes til å simulere utførelsen av en funksjon. Det betyr at denne containeren mottar funksjonen, men ikke utfører den.

Bare - er dette hovedbeholderen som utfører alle funksjonene, men hvis verdien endres til en falsk verdi eller filter metoden returnerer false, vil den sende den videre til Ingenting container.

Kanskje - Jeg tar startverdien og bestemmer hvilken container som skal kalles i starten.

Erklæring

const Just = verdi => ({
map: fn => Maybe(fn(verdi)),
chain: fn => fn(verdi),
of: () => value,
getOr: () => value,
filter: fn => fn(verdi) ? Just(verdi) : Nothing(),
type: 'just'
});

const Nothing = () => ({
map: fn => Nothing(),
chain: fn => fn(),
of: () => Nothing(),
getOr: substitute => substitute,
filter: () => Nothing(),
type: 'ingenting'
});

const Maybe = verdi =>
value === null || value === undefined || value.type === 'nothing'
? Nothing()
: Just(verdi)
tabellmetoder funktor

La oss nå bygge det forrige eksempelet om betingelsen. Hvis max er større enn null, vil funksjonen bli utført. Ellers vil den returnere 0.

Imperativt eksempel

const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} ellers {
return 0
}
}

const bookMiddlePage = 200

const randomPage = randomInt(10) || bookMiddlePage // returnerer tilfeldig
const randomPage = randomInt(-10) || bookMiddlePage // returnerer 200

Deklarativt eksempel

const randomIntWrapper = (max) => (max)
Maybe(max)
.filter(max => max > 0) // verdien false ignorerer videre anrop
.map(økning)
.map(multiplyBy(Math.random())))
.map(Math.floor)

const bookMiddlePage = 200

// Bare beholder
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // returnerer tilfeldig
// Ingenting beholder
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // returnerer 200


samarbeidsbanner

Relaterte artikler

Programvareutvikling

Asynkron og enkelttrådet JavaScript?

JavaScript er et enkelttrådet språk og samtidig også ikke-blokkerende, asynkront og samtidig. Denne artikkelen forklarer hvordan det skjer.

Lukasz Kolko
E-commerce

Dilemmaer knyttet til cybersikkerhet: Datalekkasjer

Førjulsrushet er i full gang. På jakt etter gaver til sine kjære er folk stadig mer villige til å "storme" nettbutikkene

The Codest
Jakub Jakubowicz CTO og medgrunnlegger

Abonner på vår kunnskapsbase og hold deg oppdatert på ekspertisen fra IT-sektoren.

    Om oss

    The Codest - Internasjonalt programvareutviklingsselskap med teknologisentre i Polen.

    Storbritannia - Hovedkvarter

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokale teknologisentre

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      The Codest

    • Hjem
    • Om oss
    • Tjenester
    • Casestudier
    • Vet hvordan
    • Karriere
    • Ordbok

      Tjenester

    • Det rådgivende
    • Programvareutvikling
    • Backend-utvikling
    • Frontend-utvikling
    • Staff Augmentation
    • Backend-utviklere
    • Ingeniører i skyen
    • Dataingeniører
    • Annet
    • QA-ingeniører

      Ressurser

    • Fakta og myter om samarbeid med en ekstern programvareutviklingspartner
    • Fra USA til Europa: Hvorfor velger amerikanske oppstartsbedrifter å flytte til Europa?
    • Sammenligning av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinene), Eurasia (Tyrkia)
    • Hva er de største utfordringene for CTO-er og CIO-er?
    • The Codest
    • The Codest
    • The Codest
    • Retningslinjer for personver
    • Vilkår for bruk av nettstedet

    Opphavsrett © 2025 av The Codest. Alle rettigheter forbeholdt.

    nb_NONorwegian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek nb_NONorwegian