Slide 1

Slide 1 text

Javascript Functional Programming

Slide 2

Slide 2 text

Programmazione procedurale modificazione dello stato del programma (valori mutabili) sequenzialità dei comandi utilizza controlli condizionali e iterativi (if e for)

Slide 3

Slide 3 text

Programmazione procedurale var newList= []; for (var cnt = 0; cnt <= 10; cnt++) { if (cnt < 6) newList.push(cnt) }

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Programmazione Funzionale function fib(n){ return n<2?n:fib(n-1)+fib(n-2); } http://en.literateprograms.org/Fibonacci_numbers_(JavaScript)

Slide 6

Slide 6 text

Programmazione Funzionale var select = function(el) { return el < 6 }; filter(select, range(1,10));

Slide 7

Slide 7 text

First Class Functions Funzioni manipolabili come dati

Slide 8

Slide 8 text

First Class Functions Passabili come parametri $("div.players").each(function() { console.log($(this).attr('id')); });

Slide 9

Slide 9 text

First Class Functions Possono generare altre funzioni var sum = function (a) { return function(b) { return a+b; }; }; sum(1)(2); // -> 3

Slide 10

Slide 10 text

High Order Functions Le HOF nella programmazione funzionale, sono funzioni che possono manipolare altre funzioni, accettarle come parametri, crearle, o trasformarle in altre funzioni

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

High Order Function Esempi Esempi di HOF estrapolate dalla libreria functional.js di Oliver Steele http://osteele.com/sources/javascript/functional/

Slide 15

Slide 15 text

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);

Slide 16

Slide 16 text

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);

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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.

Slide 20

Slide 20 text

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)))

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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.

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Partial E' lo stesso identico meccanisco del currying, solo che non si rispetta un ordine sequenziale di definizione dei parametri, ma un ordine casuale

Slide 25

Slide 25 text

Partial var sum5=sum.partial(1,_,_,4); sum5(2,3); -> ritorna 10 oppure var sum8=sum.partial(1,_,3,4); sum8(2); -> ritorna 10;

Slide 26

Slide 26 text

Approfondimenti On Lisp di Paul Graham Librerie per functional programming underscore.js async.js bacon.js (Functional reactive Programming)