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.