Programmazione Liste e funzioni (parte I)

Transcript

Programmazione Liste e funzioni (parte I)
Programmazione
Liste e funzioni (parte I)
Samuel Rota Bulò
DAIS
Università Ca’ Foscari di Venezia.
Liste
Funzioni
Outline
Liste
Funzioni
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Le liste
I
Le liste rappresentano un’altra famiglia di tipi strutturati.
Liste
Dato un insieme A chiamiamo lista di tipo A una sequenza di
elementi in A. L’insieme delle liste di tipo A è dato da
A list =
∞
[
Ai = {∅} ∪ A ∪ (A × A) ∪ (A × A × A) ∪ · · ·
i=0
I
Una lista si crea racchiudendo tra parentesi quadre una
sequenza di elementi dello stesso tipo separati da “;”
# [ 1; 2; 3; 4];;
- : int list = [1; 2; 3; 4]
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Attenzione
I
I
I
I
Gli elementi di una lista devono essere dello stesso tipo !
# [ 1; true; 0.9];;
^^^^
This expression has type bool but is here used
with type int
Ennuple e liste sono cose diverse:
# [ 1; 2];;
- : int list = [1; 2]
# ( 1, 2);;
- : int * int = (1, 2)
Due liste con elementi dello stesso tipo anche se di lunghezza
diversa hanno lo stesso tipo int list.
Due ennuple con elementi dello stesso tipo di lunghezza
diversa hanno tipi differenti !
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Operazioni su liste
I
Per aggiungere un elemento in testa ad una lista si utilizza
l’operatore “::”.
# 1.::[ 2.; 3.; 4.];;
- : float list = [1.; 2.; 3.; 4.]
I
Nota: non possiamo usarlo per aggiungere elementi in coda, e
non possiamo utilizzarlo tra due liste.
I
Date due liste dello stesso tipo possono essere concatenate
con l’operatore “@”.
# [’a’;’b’]@[’c’;’d’;’e’];;
- : char list = [’a’; ’b’; ’c’; ’d’; ’e’]
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Outline
Liste
Funzioni
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni
I
Una funzione f : A → B è una relazione definita tra A e B
che associa ad ogni elemento di A al più un elemento di B.
I
L’insieme A è detto dominio della funzione, mentre B è il
codominio della funzione.
I
Una funzione è totale se la funzione è definita per ogni
elemento di A, altrimenti è detta parziale.
I
Il dominio di definizione di una funzione parziale è il
sottoinsieme di A su cui la funzione è definita.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni
I
Una funzione è un’espressione che può essere vautata.
I
Il valore dell’espressione è la funzione stessa.
#
#
:
I
I
sqrt;;
: float -> float = <fun>
float_of_int;;
int -> float = <fun>
Una funzione f con dominio di tipo A e codominio di tipo B
ha tipo A -> B.
Una funzione può essere
I
I
I
passata come argomento ad un’altra funzione,
ritornata come valore da una funzione,
applicata ad un espressione.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Applicazione di funzioni
I
Sia f una funzione di tipo A -> B ed e un’espressione di tipo
A.
I
Possiamo applicare f ad e scrivendo
# f e;;
I
Il risultato dell’applicazione è un’espressione di tipo B.
#
#
-
sqrt 9.0;;
: float = 3.
float_of_int 9;;
: float = 9.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Attenzione !
I
Notare che se non rispettiamo il dominio della funzione
otteniamo un errore
# sqrt 9;; (* Errore di tipo ! *)
^
This expression has type int but is here used
with type float
# sqrt 9. 8.;; (* Errore ! *)
^^^^
This function is applied to too many arguments,
maybe you forgot a ‘;’
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni con più argomenti
I
I
I
I
I
I
Le funzioni ammettono un solo argomento e un solo valore di
ritorno.
Assumiamo di avere una funzione somma che presi due reali a
e b, ritorni la loro somma a + b.
Sembrerebbe una funzione con due argomenti
# somma 1. 2.;;
- : float = 3.
In realtà è una funzione che prende un argomento e ritorna
una nuova funzione
# somma 1.;; (* Funzione x -> 1. +. x *)
- : float -> float = <fun>
Il secondo argomento è l’argomento di questa nuova funzione
# (somma 1.) 2.;; (* Equivalente a somma 1. 2. *)
- : float = 3.
Per semplicità diremo che somma ammette due argomenti.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni con più argomenti
I
Una funzione g che ammette n argomenti di tipo T1 , . . . , Tn e
ritorna un valore di tipo R ha tipo
T1 → T2 → · · · → Tn → R .
I
Se valutiamo g a;; con a di tipo T1 otteniamo una nuova
funzione di tipo T2 → · · · → Tn → R .
I
Se valutiamo g a b;; con b di tipo T2 otteniamo una
funzione di tipo T3 → · · · → Tn → R .
I
...
I
Quando valutiamo g a b ...z;; con z di tipo Tn otteniamo
un valore di tipo R.
I
Nota: un modo alternativo per fare prendere più argomenti ad
una funzione è mediante ennuple.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni prive di argomenti
I
Non esistono funzioni prive di argomenti.
I
Funzioni “prive argomenti” in realtà prendono come
argomento ().
I
Per esempio una funzione che legge una stringa digitata
dall’utente
# read_line;;
- : unit -> string = <fun>
# read_line ();;
scritto dall’utente
- : string = "scritto dall’utente"
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Funzioni prive di valore di ritorno
I
Una funzione ritorna sempre un valore.
I
Funzioni “prive di valore di ritorno” in realtà ritornano ().
I
Abbiamo già incontrato una funzione di questo tipo:
# print_endline;;
- : string -> unit = <fun>
I
Funzioni di questo tipo sono dette “ad effetto collaterale”.
I
Nota: se volessimo fare ritornare più di un valore ad una
funzione possiamo utilizzare ennuple.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Gli operatori
I
I
Tutti gli operatori (aritmetici, di confronto, su stringhe) visti
precedentemente sono funzioni.
Le funzioni il cui nome è un operatore possono essere
applicate tramite
1. notazione infissa (es: 2 + 3 ;;),
2. notazione prefissa (es: (+) 2 3 ;;).
I
Otteniamo la funzione associata ad un operatore op tramite
(op).
# (+);;
- : int -> int -> int = <fun>
# (\.);;
- : float -> float -> float = <fun>
# (&&);;
- : bool -> bool -> bool = <fun>
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Attenzione a possibili errori !
# +;; (* Errore di sintassi ! *)
^
Syntax error
# (*);; (* Confuso con inizio commento ! *)
^^^
Warning C: this is the start of a comment.
# ( * );; (* OK ! *)
- : int -> int -> int = <fun>
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Attenzione alle parentesi !
# sqrt (+.) 6. 3.;;
^^^
This function is applied to too many arguments,
maybe you forgot a ‘;’
# sqrt ((+.) 6. 3.);;
- : float = 3.
# sqrt 6. +. 3.;;
- : float = 5.44948974278317788
# sqrt (6. +. 3.);;
- : float = 3.
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Attenzione!
I
Le funzioni non possono essere confrontate.
# not > not;;
Exception: Invalid_argument equal: functional value.
# not > sqrt ;;
^^^^
This expression has type float -> float
but is here used with type bool -> bool
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.
Liste
Funzioni
Alcuni esercizi
I
Determinare tipo e valore delle seguenti espressioni:
#
#
#
#
#
#
(((+) 5 3)*((-) 5 3));;
((/) ((+) (((-) 17 14) * 5) 6) 7);;
((=) 1 (2-1))=true;;
(&&) ((>) "ciao" "hello") ((<>) ’a’ ’b’);;
true || (1/0 > 1);;
(not,1);;
Programmazione Liste e funzioni (parte I)
DAISUniversità Ca’ Foscari di Venezia.