The Codest
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Industrie
    • Fintech e banche
    • E-commerce
    • Adtech
    • Tecnologia della salute
    • Produzione
    • Logistica
    • Automotive
    • IOT
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
Freccia indietro TORNA INDIETRO
2022-06-07
Sviluppo di software

Programmazione funzionale in JavaScript Parte 2 - Combinatori

The Codest

Pawel Ged

Sviluppatore Vue.js

Questa è la seconda parte della nostra serie di articoli dedicati alla potenza della programmazione funzionale in JavaScript. Consultate questo articolo per approfondire le vostre conoscenze sui combinatori.

Introduzione ai combinatori

I combinatori sono funzioni di livello superiore che consentono di combinare funzioni, variabili o altri combinatori. Di solito, non contengono dichiarazioni delle proprie variabili o della logica aziendale. Sono gli unici che permettono di controllare il controllo in un programma di funzioni.

In questo articolo cercherò di trattarne alcuni:

  • Rubinetto
  • Arricciatura
  • Tubo/Comporre
  • Forcella
  • Alternanza
  • Sequenza

Rubinetto

Un combinatore è molto utile per le funzioni che non restituiscono nulla. Prende la funzione a cui va il parametro e poi la restituisce.

Dichiarazione

const tap = (fn) => (valore) => {
fn(valore);
restituisce il valore;
};

Esempio di imperativo

const [items, setItems] = useState(() => [])

axios
.get('http://localhost')
.then({dati } => {
setItems(dati)
console.log(dati)
onLoadData(dati)
}).then(...) // restituisce undefined - i dati nella promessa sono stati modificati

Esempio dichiarativo

const [items, setItems] = useState(() => [])

axios
.get('http://localhost')
.then(({dati }) => dati)
.then(tap(setItems)) // (data) => { setItems(data); return data }
.then(tap(console.log)) // un then = una funzione = una responsabilità
.then(tap(onLoadData))
.then(...) // ancora accesso ai dati originali
// facile mantenere il principio di apertura/chiusura

Arricciatura

Divide gli argomenti di una funzione e permette di chiamarli in sequenza.

Dichiarazione

const curry = (fn) => {
const curried = (...args) => {
if (fn.length !== args.length){
return curried.bind(null, ...args)
}
return fn(...args);
};

restituire curried

};


Esempio

const curry = (fn) => {
const curried = (...args) => {
if (fn.length !== args.length){
return curried.bind(null, ...args)
}
return fn(...args);
};

restituire curried

};
const somma = (a, b, c) => a + b + c

const currySum = curry(sum)
/*
possibili chiamate
currySum(a)(b)(c),
currySum(a)(b,c),
currySum(a,b)(c),
currySum(a,b,c)
*/

currySum(1) // (b, c) => 1 + a + b o (b) => (c) => 1 + a + b
currySum(5)(10) // (c) => 5 + 10 + b
currySum(5, 10) // (c) => 5 + 10 + b
currySum(5)(10)(20) // 35
currySum(5, 10)(20) // 35
currySum(5)(10, 20) // 35

const divideBy = curry((a, b) => b / a)
const multiplyBy = curry((a, b) => a * b)

const divideByTwo = divideBy(2)
divideByTwo(10) // restituisce 5

const multiplyByFive = multiplyBy(5)
multiplyByFive(10) // restituisce 50

Tubo/Comporre

Attraverso la composizione, è possibile passare i dati da una funzione all'altra. È importante che le funzioni accettino lo stesso numero di argomenti. La differenza tra pipe e compose è che la prima esegue le funzioni dalla prima all'ultima, mentre compose le chiama dalla fine.

Dichiarazione

const pipe = (...fns) => (value, ...args) =>
fns.reduce((v, f, i) =>
i === 0
f(v, ...args)
: f(v),
valore);

const compose = (...fns) => (valore, ...args) =>
fns.reduceRight((v, f, i) =>
i === (fns.length - 1)
? f(v, ...args)
: f(v),
valore);
const pipe = (...fns) => (value, ...args) =>
fns.reduce((v, f, i) =>
i === 0
f(v, ...args)
: f(v),
valore);

const compose = (...fns) => (valore, ...args) =>
fns.reduceRight((v, f, i) =>
i === (fns.length - 1)
? f(v, ...args)
: f(v),
valore);

Esempio di imperativo

const seno = (val) => Math.sin(val * Math.PI / 180) // non leggibile
 sine(90) // restituisce 1

Esempio dichiarativo

const sine = pipe(
multiplyBy(Math.PI) // ↓ val * Math.PI
divideBy(180), // ↓ val * Math.PI / 180
Math.sin, // ↓ Math.sin(val * Math.PI / 180)
)

const sine = compose(
Math.sin, // ↑ Math.sin(val * Math.PI / 180)
divideBy(180), // ↑ val * Math.PI / 180
multiplyBy(Math.PI) // ↑ val * Math.PI
)

seno(90) // restituisce 1

Forcella

Il combinatore a forcella è utile nelle situazioni in cui si desidera elaborare un valore in due modi e combinare il risultato.

Dichiarazione

const fork = (join, fn1, fn2) => (valore) => join(fn1(valore), fn2(valore));

Esempio

const length = (array) => array.length
const sum = (array) => array.reduce((a, b) => a + b, 0)
const divide = (a, b) => a / b

const arithmeticAverage = fork(divide, sum, length)

arithmeticAverage([5, 3, 2, 8, 4, 2]) // restituisce 4

Alternanza

Questo combinatore accetta due funzioni e restituisce il risultato della prima se è vero. Altrimenti, restituisce il risultato della seconda funzione.

Dichiarazione

const alt = (fn, orFn) => (valore) => fn(valore) || orFn(valore)

Esempio

const utenti = [{
uuid: '123e4567-e89b-12d3-a456-426655440000',
nome: 'William'
}]

const findUser = ({ uuid: searchesUuid }) =>
users.find(({ uuid }) => uuid === searchesUuid)

const newUser = data => ({ ...data, uuid: uuid() // crea un nuovo uuid })

const findOrCreate = alt(findUser, newUser)

findOrCreate({ uuid: '123e4567-e89b-12d3-a456-426655440000' }) // restituisce l'oggetto William
findOrCreate({nome: 'John' }) // restituisce l'oggetto John con il nuovo uuid

Sequenza

Accetta molte funzioni indipendenti e passa lo stesso parametro a ciascuna di esse. In genere, queste funzioni non restituiscono alcun valore.

Dichiarazione

const seq = (...fns) => (val) => fns.forEach(fn => fn(val))

Esempio

const appendUser = (id) => ({ name }) => {
document.getElementById(id).innerHTML = nome
}

const printUserContact = pipe(
findOrCreate, // restituisce l'utente
seq(
appendUser('#contact'), // utente => void
console.log, // utente => void
onContactUpdate // utente => void
)
)

printUserContact(userData)
banner di cooperazione

Articoli correlati

Illustrazione astratta di un grafico a barre in calo con una freccia in aumento e una moneta d'oro che simboleggia l'efficienza dei costi o il risparmio. Il logo The Codest appare nell'angolo in alto a sinistra con lo slogan "In Code We Trust" su uno sfondo grigio chiaro.
Sviluppo di software

Come scalare il team di sviluppo senza perdere la qualità del prodotto

Scalare il team di sviluppo? Scoprite come crescere senza sacrificare la qualità del prodotto. Questa guida tratta i segnali che indicano che è arrivato il momento di scalare, la struttura del team, le assunzioni, la leadership e gli strumenti, oltre a come The Codest può...

IL CANCRO
Sviluppo di software

Costruire applicazioni web a prova di futuro: le intuizioni del team di esperti di The Codest

Scoprite come The Codest eccelle nella creazione di applicazioni web scalabili e interattive con tecnologie all'avanguardia, offrendo esperienze utente senza soluzione di continuità su tutte le piattaforme. Scoprite come la nostra esperienza favorisce la trasformazione digitale e il business...

IL CANCRO
Sviluppo di software

Le 10 principali aziende di sviluppo software con sede in Lettonia

Scoprite le migliori aziende di sviluppo software della Lettonia e le loro soluzioni innovative nel nostro ultimo articolo. Scoprite come questi leader tecnologici possono aiutarvi a migliorare la vostra attività.

thecodest
Soluzioni per aziende e scaleup

Essenziali di sviluppo software Java: Guida all'outsourcing di successo

Esplorate questa guida essenziale sullo sviluppo di software Java con successo outsourcing per migliorare l'efficienza, accedere alle competenze e guidare il successo del progetto con The Codest.

thecodest
Sviluppo di software

La guida definitiva all'outsourcing in Polonia

L'aumento di outsourcing in Polonia è guidato dai progressi economici, educativi e tecnologici, che favoriscono la crescita dell'IT e un clima favorevole alle imprese.

IlCodesto

Iscrivetevi alla nostra knowledge base e rimanete aggiornati sulle competenze del settore IT.

    Chi siamo

    The Codest - Società internazionale di sviluppo software con centri tecnologici in Polonia.

    Regno Unito - Sede centrale

    • Ufficio 303B, 182-184 High Street North E6 2JA
      Londra, Inghilterra

    Polonia - Poli tecnologici locali

    • Parco uffici Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Ambasciata del cervello, Konstruktorska
      11, 02-673 Varsavia, Polonia

      The Codest

    • Casa
    • Chi siamo
    • Servizi
    • Case Studies
    • Sapere come
    • Carriera
    • Dizionario

      Servizi

    • Consulenza
    • Sviluppo di software
    • Sviluppo backend
    • Sviluppo Frontend
    • Staff Augmentation
    • Sviluppatori backend
    • Ingegneri del cloud
    • Ingegneri dei dati
    • Altro
    • Ingegneri QA

      Risorse

    • Fatti e miti sulla collaborazione con un partner esterno per lo sviluppo di software
    • Dagli Stati Uniti all'Europa: Perché le startup americane decidono di trasferirsi in Europa
    • Confronto tra gli hub di sviluppo Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filippine), Eurasia (Turchia)
    • Quali sono le principali sfide di CTO e CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condizioni di utilizzo del sito web

    Copyright © 2025 di The Codest. Tutti i diritti riservati.

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