Programmazione Funzioni (parte II)

Transcript

Programmazione Funzioni (parte II)
Programmazione
Funzioni (parte II)
Samuel Rota Bulò
DAIS
Università Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Outline
Funzioni: seconda parte
Esercizi
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Definizione di funzioni
I
I
I
I
I
I
Abbiamo già visto cos’è una funzione. Vediamo come crearle.
In ML non è necessario specificare il tipo del dominio e del
codominio, in quanto viene inferito dal contesto.
Non è nemmeno necessario dare un nome ad una funzione.
Una funzione “anonima” viene definita nel seguente modo:
fun <arg> -> <expr>
<arg> è il parametro formale della funzione
<expr> è il corpo della funzione in cui il parametro formale
può comparire
# fun x -> x+1;;
- : int -> int = <fun>
# (fun x -> x+1) 2;;
- : int = 3
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Funzioni con nome
I
I
I
I
Sappiamo che le funzioni sono valori.
Abbiamo visto come dare un nome a dei valori con il let.
Quindi possiamo usarlo per dare un nome ad una funzione.
# let raddoppia = fun x -> 2.*.x;;
val raddoppia : float -> float = <fun>
# let circonferenza = let pi=3.14 in
fun raggio -> raddoppia pi*.raggio;;
val circonferenza : float -> float = <fun>
# circonferenza 1.;;
- : float = 6.28
Per le funzioni con nome esiste un modo più veloce per
definirle
let <fun> <arg> = <expr>
let <fun> <arg> = <expr1> in <expr2>
# let circonferenza raggio = let pi=3.14 in
raddoppia pi*.raggio;;
val circonferenza : float -> float = <fun>
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Funzioni con più argomenti
I
I
Una funzione con più argomenti è una funzione che preso il
primo argomento ritorna una nuova funzione.
Una funzione “anonima” a più argomenti si crea quindi nel
seguente modo:
fun <arg1> -> fun <arg2> -> · · · -> <expr>
# (fun a -> fun b -> fun c -> a+b+c) 1 2 3;;
- : int = 6
I
Esiste anche una forma abbreviata equivalente per ottenere la
stessa cosa:
fun <arg1> <arg2> · · · -> <expr>
# fun a b c -> a+b+c;;
- : int -> int -> int -> int = <fun>
I
Allo stesso modo esiste una forma abbreviata per funzioni con
nome e più argomenti:
let <fun> <arg1> <arg2> · · · = <expr>
# let somma3 a b c = a+b+c;;
val somma3 : int -> int -> int -> int = <fun>
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Ricapitolando
I
Posso definire somma3 in diversi modi:
#
#
#
#
#
#
#
let
let
let
let
let
let
let
somma3
somma3
somma3
somma3
somma3
somma3
somma3
Programmazione Funzioni (parte II)
=fun a -> fun b -> fun c -> a+b+c;;
=fun a -> fun b c -> a+b+c;;
=fun a b -> fun c -> a+b+c;;
a = fun b -> fun c -> a+b+c;;
a = fun b c -> a+b+c;;
a b = fun c -> a+b+c;;
a b c = a+b+c;;
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Outline
Funzioni: seconda parte
Esercizi
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.
Funzioni: seconda parte
Esercizi
Esercizi
I
Scrivere una funzione che dati 3 argomenti:
1.
2.
3.
4.
5.
I
I
I
I
ritorni il massimo tra questi;
verifichi se sono tutti uguali;
verifichi se sono tutti diversi;
verifichi se solo due sono uguali;
verifichi se è possibile formare un triangolo avendoli come lati.
Scrivere la funzione condizionale.
Creare la funzione di composizione.
Scrivere una funzione che inverta una coppia (es. inverti
(1,2) deve ritornare (2,1) ).
Scrivere una funzione che dati 3 interi (giorno, mese e anno)
ritorni una stringa corrispondente alla data se questa è
corretta. Se non lo è deve ritornare ”data invalida” (es: data
1 2 2009 deve ritornare "1 febbraio 2009", mentre data
31 2 2009 deve ritornare "data invalida")
Programmazione Funzioni (parte II)
DAISUniversità Ca’ Foscari di Venezia.