Higher order functions
Una higher order function è una funzione che accetta un'altra funzione come argomento e/o ritorna un'altra funzione.
Funzioni pure e impure
Le funzioni pure o pure functons sono quelle il cui output dipende soltanto dai suoi inputs e non causa effetti collaterali o side effects. Se una funzione non ha parametri e non ritorna nulla probabilmente è una funzione impura.
//pure function:
function calcolaQuadrato(num) {
return num * num;
}
//impure function perchè il suo output non deriva soltanto dagli inputs (i parametri) ma anche da una variabile esterna
const prezzo = 5;
function totaleCarrello(quantita) {
return prezzo * quantita;
}
//impure function perchè dà diversi output per lo stesso input
function generaPIN(userID) {
return Math.floor(Math.random() * userID);
}
//impure function perchè crea dei side effects
let user = {};
function setName(name) {
user.name = name;
}
Al di fuori del contesto browser anche il loggare è considerato un side effect perchè va a modificare l'ambiente.
Immutable data
I tipi di dato primitivi (booleani, numeri, stringhe, null e undefined) sono tipi di dato immutabili, cioè il loro valore non può essere cambiato dopo la creazione (ma gliene si può sempre assegnare un altro!).
let immutabile = "Ciao!";
immutabile[0] = "M";
console.log(immutabile); // "Ciao!" perchè non posso mutare il valore di una stringa
//ma posso sempre assegnargliene un altro
immutabile = "Miao!";
console.log(immutabile); // "Miao!"
I tipi di dato non primitivi invece possono essere mutati a causa del passaggio di valori per riferimento ma nella programmazione funzionale questo va evitato. Quando si vuole modificare un dato se ne fa una copia senza modificare l'originale.
I tipi primitivi sono memorizzati nello Stack, una parte della memoria RAM organizzata secondo il sistema LIFO (last in first out) ad accesso moto veloce. Gli altri tipi di dato sono memorizzati nell'Heap, dove non c'è un ordine preciso ed ogni oggetto ha il proprio indirizzo.
var amica = "Maria";
var altraAmica = amica;
var friend = {nome: "Anna", anni: "29"}
var newFriend = friend;
Currying
Il currying è una tecnica per scrivere le funzioni in modo che ricevano gli argomenti uno alla volta, ritornando ogni volta una nuova funzione con uno degli argomenti.
//funzione normale
function calcolaVolume(lungh, largh, alt) {
return lungh * largh * alt;
}
const solido1 = calcolaVolume(10,20,30);
//funzione curryed
function calcolaVolumeCurryed(lungh) {
return (largh) => {
return (alt) => {
return lungh * largh * alt;
}
}
}
const solido2 = calcolaVolumeCurryed(10)(20)(30);