Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Javascript functional programming

Javascript functional programming

Slides from my talk javascript functional programming

Avatar for francesco agati

francesco agati

April 11, 2013
Tweet

Other Decks in Programming

Transcript

  1. Programmazione procedurale modificazione dello stato del programma (valori mutabili) sequenzialità

    dei comandi utilizza controlli condizionali e iterativi (if e for)
  2. Programmazione procedurale var newList= []; for (var cnt = 0;

    cnt <= 10; cnt++) { if (cnt < 6) newList.push(cnt) }
  3. Programmazione Funzionale assenza di stati (valori immutabili, funzioni pure, niente

    variabili) Funzioni come dato (passabili come argomenti o generate da altre funzioni HOF) utilizzo di ricorsione, pattern matching e composizione di funzioni
  4. First Class Functions Possono generare altre funzioni var sum =

    function (a) { return function(b) { return a+b; }; }; sum(1)(2); // -> 3
  5. High Order Functions Le HOF nella programmazione funzionale, sono funzioni

    che possono manipolare altre funzioni, accettarle come parametri, crearle, o trasformarle in altre funzioni
  6. High Order Functions var generateAccumulator=function(start) { var acc = start;

    return function(n) { acc=acc+n; console.log(acc); return acc; } }; fnAcc=generateAccumulator(10); fnAcc(1); fnAcc(2); fnAcc(3); otteniamo 11,13 e 16
  7. Closure Because Common Lisp is lexically scoped, when we define

    a function containing free variables, the system must save copies of the bindings of those variables at the time the function was defined. Such a combination of a function and a set of variable bindings is called a closure. Closures turn out to be useful in a wide variety of applications. (Paul Graham, On Lisp, cap 2.6)
  8. Closure var generateAccumulator=function(start) { var acc = start; return function(n)

    { acc=acc+n; console.log(acc); return acc; } }; Definizione della closure Variabile locale visibile nello scopo delle funzioni figlie della HOF Funzione ritornata dalla HOF
  9. High Order Function Esempi Esempi di HOF estrapolate dalla libreria

    functional.js di Oliver Steele http://osteele.com/sources/javascript/functional/
  10. High Order Function Map trasforma una lista in un’altra lista

    (fa un mapping) var lst=[1,2,3,4,5,6,7,8,9,10]; var ret=map(function(el) { return el + 100; },lst);
  11. High Order Function Filter applica un filtro a una lista

    e ne ritorna una filtrata var lst=[1,2,3,4,5,6,7,8,9,10]; var ret=filter(function(el) { return el < 6; },lst);
  12. High Order Function Reduce accetta tre parametri (una funzione di

    trasformazione, un valore o oggetto iniziale e la lista), applica una riduzione della lista var lst=[1,2,3,4,5,6,7,8,9,10]; var ret=reduce(function(x,y) { return x+y; },0,lst); // -> 55
  13. High Order Function Reduce accetta tre parametri (una funzione di

    trasformazione, un valore o oggetto iniziale e la lista), applica una riduzione della lista var lst=[1,2,3,4,5,6,7,8,9,10]; var ret=reduce(function(x,y) { return x+y; },0,lst); // -> 55
  14. Function composition S’intende la combinazione di funzioni semplici all’interno di

    una funzione più complessa. Questo composizione, permette di creare una funzione che è il risultato di una concatenazione di funzioni. Unica condizione è che queste funzioni accettino come parametro di input e di return un unico parametro.
  15. Function composition var sum1 = function(x) { return x +

    1;}; var sum2 = function(x) { return x + 2;}; var sum3 = function(x) { return x + 3;}; var fnSum = sequence(sum1,sum2,sum3); fnSum(10); //-> 16 // equivale a sum3(sum2(sum1(10)))
  16. Function composition con HOF var genSum = function(n) { return

    function (x) { return x+ n }; } var sum1 = genSum(1); var sum2 = genSum(2); var sum3 = genSum(3); var fnSum = sequence(sum1,sum2,sum3); fnSum(10); //-> 16
  17. Currying Per Currying si intende la trasformazione di una una

    funzione che accetta più parametri in una funzione che restituisce una catena di funzioni, fino all’esaurirsi della lista di parametri. Dopo di che viene eseguito il corpo vero è proprio della funzione.
  18. Currying var sum=function(a,b,c,d) { return a+b+c+d; }; var sum3=sum.curry(1,2); //sum3

    è un parziale della funzione sum con i primi 2 parametri a,b già valorizzati con 1 e 2. //sum3 diventa una funzione che accetta 2 parametri c e d. sum3(3,4); -> ritorna 10 var sum6=sum3.curry(3); //sum6 è a sua volta una parzializzaione di sum3 che accetta un unico parametro d a cui viene aggiunto il valore 6. sum6(4); -> ritorna 10
  19. Partial E' lo stesso identico meccanisco del currying, solo che

    non si rispetta un ordine sequenziale di definizione dei parametri, ma un ordine casuale
  20. Approfondimenti On Lisp di Paul Graham Librerie per functional programming

    underscore.js async.js bacon.js (Functional reactive Programming)