• 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

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

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

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]

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