window.pipedriveLeadboosterConfig = { basis: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versie: 2, } ;(functie () { var w = venster als (w.LeadBooster) { console.warn('LeadBooster bestaat al') } anders { w.LeadBooster = { q: [], on: functie (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: functie (n) { this.q.push({ t: 't', n: n }) }, } } })() Functioneel programmeren in JavaScript Deel 3 - Functor & Monade Misschien - The Codest
The Codest
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Industrie
    • Fintech & Bankieren
    • E-commerce
    • Adtech
    • Gezondheidstechnologie
    • Productie
    • Logistiek
    • Automotive
    • IOT
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
Pijl terug KEREN TERUG
2022-06-21
Software Ontwikkeling

Functioneel programmeren in JavaScript Deel 3 - Functor & Monade Misschien

The Codest

Pawel Ged

Vue.js ontwikkelaar

Bekijk het derde deel van onze Power of functional programming in JavaScript artikelenserie. Deze keer legt onze JavaScript expert meer uit over Functor en Monad Maybe.

Inleiding

Onwijzigbaar houden is vaak moeilijk te onderhouden. Het patroon om gegevens in een container te verpakken biedt redding. Het beveiligt de waarden zodat er veilig mee kan worden omgegaan en neveneffecten worden uitgesloten.

Als je hier nieuw bent, bekijk dan zeker mijn laatste 2 delen over functioneel programmeren op The Codest blog over:

  • Deel 1 - Inleiding
  • Deel 2 - Combinatoren

Functor

Het heeft geen complexe logica. De belangrijkste taak is om de context in te pakken en de functies die het van buitenaf ontvangt erop uit te voeren. Telkens wanneer de waarde verandert, wordt een nieuwe containerinstantie opnieuw ingepakt en teruggestuurd. Wanneer de kaart methode, die een specifieke actie uitvoert, retourneert het een nieuwe containerinstantie met de waarde die is geretourneerd door de doorgegeven functie, terwijl het principe van niet-wijzigbaarheid behouden blijft.

Verklaring

 const Functor = value => ({
     map: fn => Functor(fn(value)),
     keten: fn => fn(waarde),
     van: () => value
 });

kaart - handig als je de status van een waarde in een container wilt wijzigen, maar deze nog niet wilt retourneren.

ketting - wordt gebruikt als je een waarde wilt doorgeven aan een functie zonder de toestand van de container te wijzigen. Meestal aan het einde van kaart oproepen.

van - huidige waarde retourneren

Imperatief voorbeeld

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

const randomNumber = randomInt(200) // geeft getal tussen 0 en 200 terug

decrease(randomNumber) // geeft (getal tussen 0 en 200) - 1 terug

Declaratief voorbeeld

const randomIntWrapper = (max) =>
Functor(max)
.map(verhogen) // 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() // geeft getal tussen 0 en 200 terug
randomNumber.chain(decrease) // geeft (getal tussen 0 en 200) - 1 terug

Monade

Soms heb je, naast de functies die de nieuwe toestand van de waarde triggeren, extra logica nodig die verborgen zit in de container. Dit is waar monad van pas komt, omdat het een uitbreiding is van functor. Het kan bijvoorbeeld beslissen wat er moet gebeuren als de waarde een bepaalde waarde heeft of welk pad de volgende acties moeten volgen.

Monade Misschien

Monad lost misschien het probleem op van waarden die niet waar retourneren. Wanneer dit gebeurt, kunnen volgende kaart aanroepen worden genegeerd, maar je kunt wel een alternatief retourneren door de getOr methode. Hiermee kun je het gebruik van if / else operatoren vermijden, die populair zijn in dwingend programmeren. Deze monade bestaat uit drie containers:

Niets - wordt uitgevoerd wanneer een waarde die niet waar is in de container valt of filter Methode retourneert false. Deze wordt gebruikt om de uitvoering van een functie te simuleren. Dit betekent dat deze container de functie ontvangt, maar deze niet uitvoert.

Gewoon - dit is de hoofdcontainer die alle functies uitvoert, maar als de waarde verandert in een valse waarde of filter methode false retourneert, wordt deze doorgegeven aan de Niets container.

Misschien - Ik neem de beginwaarde en beslis welke container aan het begin wordt aangeroepen.

Verklaring

const Just = waarde => ({
map: fn => Maybe(fn(value)),
keten: fn => fn(waarde),
van: () => value,
getOr: () => waarde,
filter: fn => fn(waarde) ? Gewoon(waarde) : Niets(),
type: 'gewoon'.
});

const Nothing = () => ({
map: fn => Niets(),
keten: fn => fn(),
van: () => Nothing(),
getOr: vervanger => vervanger,
filter: () => Niets(),
type: 'niets
});

const Maybe = waarde =>
value === null || value === undefined || value.type === 'nothing'
? Niets()
: Gewoon()
tabelmethoden functor

Laten we nu het vorige voorbeeld over de voorwaarde bouwen. Als max groter is dan nul, wordt de functie uitgevoerd. Anders wordt 0 geretourneerd.

Imperatief voorbeeld

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

const bookMiddlePage = 200

const randomPage = randomInt(10) || bookMiddlePage // geeft random terug
const randomPage = randomInt(-10) || bookMiddlePage // geeft 200 terug

Declaratief voorbeeld

const randomIntWrapper = (max) =>
Misschien(max)
.filter(max => max > 0) // waarde false negeert verdere oproepen
.map(verhogen)
.map(multiplyBy(Math.random())
.map(Math.floor)

const bookMiddlePage = 200

// Gewoon container
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // geeft random terug
// Niets container
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // geeft 200 terug


vaandel samenwerking

Verwante artikelen

Software Ontwikkeling

Asynchroon en single-threaded JavaScript?

JavaScript is een single-threaded taal en tegelijkertijd ook non-blocking, asynchroon en concurrent. Dit artikel legt je uit hoe dat in zijn werk gaat.

Lukasz Kolko
E-commerce

Cyberbeveiligingsdilemma's: Datalekken

De prekerstdrukte is in volle gang. Op zoek naar cadeaus voor hun geliefden, zijn mensen steeds vaker bereid om online winkels te "bestormen".

The Codest
Jakub Jakubowicz CTO & medeoprichter

Abonneer je op onze kennisbank en blijf op de hoogte van de expertise uit de IT-sector.

    Over ons

    The Codest - Internationaal softwareontwikkelingsbedrijf met technische hubs in Polen.

    Verenigd Koninkrijk - Hoofdkantoor

    • Kantoor 303B, 182-184 High Street North E6 2JA
      Londen, Engeland

    Polen - Lokale technologieknooppunten

    • Fabryczna kantorenpark, Aleja
      Pokoju 18, 31-564 Krakau
    • Hersenambassade, Konstruktorska
      11, 02-673 Warschau, Polen

      The Codest

    • Home
    • Over ons
    • Diensten
    • Case Studies
    • Weten hoe
    • Carrière
    • Woordenboek

      Diensten

    • Het advies
    • Software Ontwikkeling
    • Backend ontwikkeling
    • Frontend ontwikkeling
    • Staff Augmentation
    • Backend ontwikkelaars
    • Cloud Ingenieurs
    • Gegevensingenieurs
    • Andere
    • QA ingenieurs

      Bronnen

    • Feiten en fabels over samenwerken met een externe partner voor softwareontwikkeling
    • Van de VS naar Europa: Waarom Amerikaanse startups besluiten naar Europa te verhuizen
    • Tech Offshore Ontwikkelingshubs Vergelijking: Tech Offshore Europa (Polen), ASEAN (Filippijnen), Eurazië (Turkije)
    • Wat zijn de grootste uitdagingen voor CTO's en CIO's?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Gebruiksvoorwaarden website

    Copyright © 2025 door The Codest. Alle rechten voorbehouden.

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