window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Funktionell programmering i JavaScript Del 3 - Functor & Monad Maybe - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2022-06-21
Utveckling av programvara

Funktionell programmering i JavaScript Del 3 - Functor & Monad Maybe

Codest

Pawel Ged

Vue.js-utvecklare

Kolla in den tredje delen av vår Power of functional programming i JavaScript-artikelserien. Den här gången förklarar vår JavaScript-expert mer om Functor och Monad Maybe.

Inledning

Ofta är det svårt att behålla oföränderligheten. Mönstret med att förpacka data i en behållare kommer till undsättning. Det säkrar värdena så att hanteringen av dem är säker med uteslutande av biverkningar.

Om du är ny här, se till att kolla mina sista 2 delar om funktionell programmering på The Codest blogg om:

  • Del 1 - Inledning
  • Del 2 - Kombinatorer

Funktor

Den har ingen komplex logik. Dess huvuduppgift är att förpacka kontexten och utföra de funktioner som den får utifrån på dem. Varje gång värdet ändras paketeras en ny containerinstans om och returneras. När du anropar karta som kräver en viss åtgärd, returnerar den en ny containerinstans med det värde som returneras av den skickade funktionen, samtidigt som principen om att den inte kan modifieras bibehålls.

Förklaring

 const Functor = värde => ({
     map: fn => Functor(fn(värde)),
     chain: fn => fn(värde),
     of: () => värde
 });

karta - användbar när du vill ändra statusen för ett värde i en container men inte vill returnera det ännu.

kedja - används om du vill skicka ett värde till en funktion utan att ändra behållarens tillstånd. Vanligtvis i slutet av karta samtal.

av - returnera aktuellt värde

Imperativt exempel

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

const randomNumber = randomInt(200) // returnerar ett tal mellan 0 och 200

decrease(randomNumber) // returnerar (tal mellan 0 och 200) - 1

Deklarativt exempel

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 = slumpmässigtIntWrapper(200)

randomNumber.of() // returnerar tal mellan 0 och 200
randomNumber.chain(decrease) // returnerar (tal mellan 0 och 200) - 1

Monad

Ibland behöver du, förutom de funktioner som utlöser det nya tillståndet för värdet, ytterligare logik dold i behållaren. Det är här monad kommer till nytta, eftersom det är en förlängning av funktor. Den kan t.ex. bestämma vad som ska hända när värdet har ett visst värde eller vilken väg nästa åtgärd ska ta.

Monad Kanske

Monad maybe löser problemet med värden som returnerar något som inte är sant. När detta händer kommer efterföljande karta ignoreras, men du kan returnera ett alternativ genom att anropa hämtaOr metod. Det gör att du kan undvika att använda if / else-operatorer, som är populära i tvingande programmering. Denna monad består av tre behållare:

Ingenting - körs när ett värde som inte är sant faller in i behållaren eller filter metoden returnerar falskt. Den används för att simulera utförandet av en funktion. Detta innebär att denna container tar emot funktionen men inte utför den.

Bara - är detta huvudbehållaren som utför alla funktioner, men om värdet ändras till ett falskt värde eller filter metoden returnerar false, kommer den att skicka den till Ingenting container.

Kanske - Jag tar startvärdet och bestämmer vilken container som ska anropas i början.

Förklaring

const Just = värde => ({
map: fn => Maybe(fn(värde)),
chain: fn => fn(värde),
av: () => value,
getOr: () => värde,
filter: fn => fn(värde) ? Just(värde) : Ingenting(),
typ: 'bara'
});

const Nothing = () => ({
map: fn => Ingenting(),
chain: fn => fn(),
av: () => Nothing(),
getOr: substitute => substitute,
filter: () => Ingenting(),
typ: 'ingenting'
});

const Maybe = värde =>
value === null || value === undefined || value.type === 'nothing'
? Ingenting()
: Just(värde)
tabell metoder funktor

Låt oss nu bygga upp det tidigare exemplet om villkoret. Om max är större än noll kommer funktionen att utföras. Annars kommer den att returnera 0.

Imperativt exempel

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

const bookMiddlePage = 200

const randomPage = randomInt(10) || bookMiddlePage // returnerar slumpmässigt
const randomPage = randomInt(-10) || bookMiddlePage // returnerar 200

Deklarativt exempel

const randomIntWrapper = (max) => Kanske
Kanske(max)
.filter(max => max > 0) // värdet false ignorerar ytterligare anrop
.map(öka)
.map(multiplyBy(Math.random())))
.map(matte.golv)

const bookMiddlePage = 200

// Bara en behållare
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // returnerar slumpmässigt
// Behållare för ingenting
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // returnerar 200


samarbetsbanner

Relaterade artiklar

Utveckling av programvara

Asynkron och enkeltrådad JavaScript?

JavaScript är ett enkeltrådat språk och samtidigt också icke-blockerande, asynkront och samtidigt. Den här artikeln kommer att förklara för dig hur det händer.

Lukasz Kolko
E-commerce

Dilemman inom cybersäkerhet: Dataläckage

Julruschen är i full gång. I jakt på presenter till sina nära och kära är människor alltmer villiga att "storma" onlinebutiker

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

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

    Polen - Lokala tekniknav

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

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

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