• Non ci sono risultati.

Programmazione Funzionale

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Funzionale"

Copied!
13
0
0

Testo completo

(1)

Introduzione alla

Programmazione Funzionale

Luca Abeni

(2)

Paradigmi di Programmazione

• Programmi sviluppabili usando diversi paradigmi

• Imperativo: computazione come modifica di stato

• Funzionale: computazione come riduzione

• ...

• Paradigma imperativo

• Variabili modificabili: ambiente associa nome a variabile, memoria associa variabile a valore

• Costrutto fondamentale: assegnamento

• Modifica associazione fra variabile e valore

• R-Value “contenuto” nella variabile

• Direttamente mappabile su macchina di Von Neumann

(3)

Paradigma di Programmazione Funzionale

• Paradigma funzionale → no stato / variabili modificabili

• No variabili modificabili ⇒ no assegnamento

• Ambiente, ma no memoria

• Solo espressioni e funzioni (no comandi)

• Computazione come riduzione / riscrittura di espressioni

• Invece che modifica dello stato...

• Riduzione??? Riscrittura di espressioni???

(4)

Computazione Funzionale

• No stato modificabile → no iterazione (loop)!

• Basata su ripetere operazioni fino a che un predicato `e vero

• Predicato: funzione booleana dello stato... Stato non modificabile ⇒ predicato sempre vero o

sempre falso ⇒ iterazione non ha senso!

• Invece che iterazione, Ricorsione!

• Esempi di linguaggi funzionali: ML (varie

incarnazioni), Lisp (varie incarnazioni - Scheme), Haskell, ...

• Fondamento teorico / matematico: λ-calcolo!

(5)

Funzioni: Definizione ed Applicazione

• Funzione: relazione fra dominio e codominio che associa ad un elemento del dominio un solo

elemento del codominio

• f : X → Y

• f ⊂ X × Y : (x, y1) ∈ f ∧ (x, y2) ∈ f ⇒ y1 = y2

• (x, y) ∈ f → y = f (x)

• f(x): significato ambiguo

• f(x) = x2: definizione di f()

• f(3): applicazione di f () al numero 3

• Stessa sintassi (f(x)) per esprimere la

definizione e l’applicazione di una funzione?

(6)

Definizione o Applicazione?

• In matematica, il significato di “f(x)” dipende dal contesto...

• Vedi “f(x) = x2” vs “f(3)”

• ...In un linguaggio di programmazione, vorremmo una semantica univoca!

• La distinzione fra definizione ed applicazione deve essere chiarita dalla sintassi...

• ...Non dal contesto!!!

• Distinguere definizione da applicazione:

• In ML, fn per definizione

• In C, definizione con prototipo seguito da blocco di codice

• ...

(7)

Definizione di Funzioni

• In linguaggi di programmazione, sintassi per distinguere definizione da applicazione

Esempio: in ML, fn x => x ∗ x; definisce una funzione che calcola x2

• In linguaggi funzionali, le funzioni sono valori esprimibili

• Funzioni come risultato di espressioni (esempio stupido: espressione fn)

• Nota: vere funzioni (== chiusure), non puntatori a funzione (in cui manca ambiente!)

• Esempio: funzione derivata per capire meglio

(8)

Funzioni Anonime

val f = fn x => x ∗ x; definisce un simbolo f associato alla funzione che calcola x2

• Nota: sul libro, definizione leggermente imprecisa di fun ( `e val rec, non val!)

• Conseguenza dell’esistenza di un costrutto per definire funzioni (fn in Standard ML) : si possono definire anche funzioni anonime

“fn x => x ∗ x;”, senza “val f =” davanti

• Curiosit `a: esiste qualcosa di simile anche in C++:

[ ] ( i n t x ) {

r e t u r n x ∗ x ; } ;

• Vedere funzione derivata in C++

(9)

Applicazione di Funzioni

• Differenti linguaggi definiscono differenti sintassi

• f(2);

• (f 2)

• f 2;

• Nota: in ML tutte le espressioni di qui sopra sono valide...

• A differenza di matematica, chiara differenza fra definizione ed applicazione di una funzione!

(10)

Applicazione di Funzioni Anonime!

• Interessante conseguenza: si possono applicare anche funzioni anonime

(fn x => x ∗ x) 3;

• Ancora, anche in C++:

[ ] ( i n t x ) {

r e t u r n x ∗ x ; } ( 3 )

(11)

Esecuzione Come Valutazione

• Programma funzionale: composto da espressioni

• “Eseguito” valutando le espressioni

• Esempio: fattoriale!

unsigned i n t f a c t ( unsigned i n t n ) {

r e t u r n n == 0 ? 1 : n ∗ f a c t ( n − 1 ) ; }

• Notare “if aritmetico” (p ? a : b)

• fact(4) = ?

(12)

Esempio di Valutazione

fact(4) = ...

fact(4) = (4 == 0) ? 1 : 4 * fact(3) = 4 * fact(3) =

4 * ((3 == 0) ? 1 : 3 * fact(2)) = 4 * 3 * fact(2) =

4 * 3 * ((2 == 0) ? 1 : 2 * fact(1)) = 4 * 3 * 2 * fact(1) =

4 * 3 * 2 * ((1 == 0) ? 1 : 1 * fact(0)) =

4 * 3 * 2 * 1 * 1 = 24

(13)

Alcune Osservazioni

• Per essere puramente funzionale, if aritmetico!

unsigned i n t f a c t ( unsigned i n t n ) {

r e t u r n n == 0 ? 1 : n ∗ f a c t ( n − 1 ) ; }

vs

unsigned i n t f a c t ( unsigned i n t n ) {

i f ( n == 0 ) { r e t u r n 1 ; } else {

r e t u r n n ∗ f a c t ( n − 1 ) ; }

Riferimenti

Documenti correlati

07 - Funzioni vettoriali, derivata della funzione composta, for- mula di Taylor.. Riferimenti: R.Adams, Calcolo

Mauro

Partendo dal significato geometrico del rapporto incrementale e osservando che al tendere di h a zero, il punto Q tende a P e la retta secante , passante per i punti P e Q , tende

Questa sintassi è ispirata alla sintassi dei prototipi di funzione e al modo in cui il puntato- re viene usato una volta definito: (*nome) è l’oggetto puntato da nome, ed è appunto

Allora si può dire che il valore della derivata di una funzione rappresenta il coefficiente angolare della retta r s , tangente la funzione nel

[r]

La velocità istantanea indica la “rapidità” con cui varia lo spazio al variare del tempo e coincide con il coefficiente angolare della retta tangente nel punto considerato.

Si potrebbe anche pensare al- l'acqua permanens vista quale femminile materno e ctonio mondo del caos, uno spumeggiare bianco come doveva essere il mare attorno ad Afrodite