javascript functional programming

26
Javascript Functional Programming

Upload: appsterdam-milan

Post on 29-Nov-2014

465 views

Category:

Technology


1 download

DESCRIPTION

Talk di Francesco Agati sulla programmazione funzionale, durante il TalkLab di AppsterdamMilan del 11 Aprile 2013. https://speakerdeck.com/francescoagati/javascript-functional-programming

TRANSCRIPT

Page 1: Javascript functional programming

Javascript FunctionalProgramming

Page 2: Javascript functional programming

Programmazione procedurale

modificazione dello stato del programma (valori mutabili)

sequenzialità dei comandi

utilizza controlli condizionali e iterativi (if e for)

Page 3: Javascript functional programming

Programmazione procedurale

var newList= []; for (var cnt = 0; cnt <= 10; cnt++) {

if (cnt < 6) newList.push(cnt) }

Page 4: Javascript functional programming

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

Page 5: Javascript functional programming

Programmazione Funzionalefunction fib(n){ return n<2?n:fib(n-1)+fib(n-2);}

http://en.literateprograms.org/Fibonacci_numbers_(JavaScript)

Page 6: Javascript functional programming

Programmazione Funzionale

var select = function(el) { return el < 6

};

filter(select, range(1,10));

Page 7: Javascript functional programming

First Class Functions

Funzioni manipolabili come dati

Page 8: Javascript functional programming

First Class Functions

Passabili come parametri

$("div.players").each(function() {console.log($(this).attr('id'));

});

Page 9: Javascript functional programming

First Class Functions

Possono generare altre funzioni

var sum = function (a) { return function(b) {

return a+b; }; };

sum(1)(2); // -> 3

Page 10: Javascript functional programming

High Order Functions

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

Page 11: Javascript functional programming

High Order Functionsvar 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

Page 12: Javascript functional programming

Closure

Because Common Lisp is lexically scoped, when we define a function containingfree variables, the system must save copies of the bindings of those variables atthe time the function was defined. Such a combination of a function and a setof variable bindings is called a closure. Closures turn out to be useful in a widevariety of applications.(Paul Graham, On Lisp, cap 2.6)

Page 13: Javascript functional programming

Closurevar 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

Page 14: Javascript functional programming

High Order FunctionEsempi

Esempi di HOF estrapolate dalla libreria

functional.js di Oliver Steele

http://osteele.com/sources/javascript/functional/

Page 15: Javascript functional programming

High Order FunctionMap

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

Page 16: Javascript functional programming

High Order FunctionFilter

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

Page 17: Javascript functional programming

High Order FunctionReduce

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

Page 18: Javascript functional programming

High Order FunctionReduce

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

Page 19: Javascript functional programming

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.

Page 20: Javascript functional programming

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

Page 21: Javascript functional programming

Function compositioncon 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

Page 22: Javascript functional programming

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.

Page 23: Javascript functional programming

Curryingvar 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

Page 24: Javascript functional programming

Partial

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

parametri, ma un ordine casuale

Page 25: Javascript functional programming

Partialvar sum5=sum.partial(1,_,_,4);

sum5(2,3);

-> ritorna 10

oppure

var sum8=sum.partial(1,_,3,4);

sum8(2);

-> ritorna 10;

Page 26: Javascript functional programming

Approfondimenti

On Lisp di Paul Graham

Librerie per functional programming

underscore.jsasync.jsbacon.js (Functional reactive Programming)