![Page 1: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/1.jpg)
OCaml:unveloceripasso
1
![Page 2: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/2.jpg)
Los%lefunzionale
• In Java (ma anche in C) l’effetto osservabile di un programma è la modifica dello stato
• In Ocaml il risultato della computazione è la produzione di un nuovo valore
temp = pair.x; pair.x = pair.y; pair.y = temp;
let x = 5 in (x,x)
![Page 3: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/3.jpg)
Value-orientedprogramming
• Programmazionefunzionale:“value-orientedprogramming”o unprogrammaOcamlèunaespressioneo unaespressioneOcamldenotaunvalore
• L’esecuzionediunprogrammaOCamlpuòesserevistacomeunasequenzadipassidicalcolo(semplificazionidiespressioni)cheallafineproduceunvalore
![Page 4: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/4.jpg)
Espressioni
• Sintassi:regoledibuonaformazione• Seman%ca
o regoleditypechecking(%pooerrore)o regolediesecuzionechegaran%sconocheespressioni%pate
produconounvalore
![Page 5: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/5.jpg)
Valori
• Unvaloreèunaespressionechenondeveesserevalutataulteriormenteo 34èunvaloredi%pointo 34+17èun’espressionedi%pointmanonèunvalore
![Page 6: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/6.jpg)
Valori
• Lanotazione<exp>⇒<val>indicachelaespressione<exp>quandovalutatacalcolailvalore<val>
3⇒3(valoridibase)3+4⇒72*(4+5)⇒18
eval(e)=vmetanotazionepere⇒v
![Page 7: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/7.jpg)
let
• Sintassi:letx=e1ine2o xiden%fiero e1,e2espressionio letx=e1ine2espressioneo x=e1binding
• letx=2inx+xletincx=x+1ininc10lety="programmazione"in(letz="2"iny^z)
![Page 8: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/8.jpg)
let
• letx=e1ine2• Regoladivalutazione
o eval(e1)=v1o sos%tuireilvalorev1pertuZeleoccorrenzedixine2oZenendo
l’espressionee2’o subst(e2,x,v1)=e2’o eval(e2’)=vo eval(letx=e1ine2)=v
![Page 9: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/9.jpg)
let
eval(e1) = v1 subst(e2, x,v1) = e2' eval(e2') = veval(let x = e1 in e2) = v
![Page 10: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/10.jpg)
Esempio
• eval(letx=1+4inx*3)o eval(1+4)=5
• eval(letx=5inx*3)o subst(x*3,x,5)=5*3
• eval(5*3)=15• eval(letx=1+4inx*3)=15
![Page 11: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/11.jpg)
letbinding=scope
letx=42in
(*ynonèvisibile*)
x+(lety="3110"in (*yèvisibile*)
int_of_stringy)
![Page 12: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/12.jpg)
scope:overlapping
let x = 5 in ((let x = 6 in x) + x)
Duecasi ((let x = 6 in x) + 5) ((let x = 6 in 5) + 5)
![Page 13: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/13.jpg)
scope:overlapping
let x = 5 in ((let x = 6 in x) + x)
Duecasi ((let x = 6 in x) + 5) ((let x = 6 in 5) + 5)
![Page 14: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/14.jpg)
scope:overlapping
let x = 5 in ((let x = 6 in x) + x)
Duecasi ((let x = 6 in x) + 5) ((let x = 6 in 5) + 5)
![Page 15: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/15.jpg)
Alphaconversione
• L’identità puntuale delle variabili legate non ha alcun senso!! • In matematica
– f(x) = x * x – f(y) = y * y
sono la medesima funzione!! • In informatica
– let x = 5 in ((let x = 6 in x) + x) – let x = 5 in ((let y = 6 in y) + x)
![Page 16: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/16.jpg)
Dichiarazionedifunzioni
letf(x:int):int=lety=x*10iny*y;;
![Page 17: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/17.jpg)
Funzioniricorsive
letrecpowxy=ify=0then1elsex*powx(y-1);;
![Page 18: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/18.jpg)
Applicazionedifunzioni
letf(x:int):int=lety=x*10iny*y;;f5;;-:int=2500
![Page 19: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/19.jpg)
Applicazionedifunzioni
letrecpowxy=ify=0then1elsex*powx(y-1);;pow23;;-:int8
![Page 20: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/20.jpg)
Dichiarazione
• Lavalutazionediunadichiarazionediunafunzioneèlafunzionestessao lefunzionisonovalori
![Page 21: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/21.jpg)
Applicazione
• eval(e0e1...en)=v'seo eval(e0)=letfx1...xn=eo eval(e1)=v1...eval(en)=vno subst(e,x1,…,xn,v1,...,vn)=e'o eval(e')=v'
![Page 22: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/22.jpg)
Esempi
• letdouble(x:int):int=2*x;;• letsquare(x:int):int=x*x;;• letquad(x:int):int=double(doublex);;• letfourth(x:int):int=square(squarex)
![Page 23: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/23.jpg)
Esempi
• lettwice((f:int->int),(x:int)):int=f(fx)
• letquad(x:int):int=twice(double,x)• letfourth(x:int):int=twice(square,x)
• twiceo higher-orderfunc%on:unafunzionedafunzioniadaltrivalori
![Page 24: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/24.jpg)
Funzionihigher-order
• letcompose((f,g):(int->int)*(int->int))(x:int):int=f(gx)
• letrecn%mes((f,n):(int->int)*int)=ifn=0then(fun(x:int)->x)elsecompose(f,n%mes(f,n-1))
![Page 25: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/25.jpg)
OCamlList
• letlst=[1;2;3];;• letempty=[];;• letlonger=5::lst;;• letanother=5::1::2::3::[]
![Page 26: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/26.jpg)
List:sintassi
• []lalistavuota(nilderivatodalLISP)• e1::e2inseriscel’elementoe1intestaallalistae2(::=LISPcons)• [e1;e2;...;en]notazionesintafcaperlalistae1::e2::...::en::[]
![Page 27: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/27.jpg)
Accedereaunalista
• StruZuralmenteunalistapuòessereo nil,[]o lalistaoZenutamedianteunaoperazionediconsdiunelementoa
unalista• Idea:usareilpaSernmatchingperaccedereaglielemen%dellalista• letemptylst=matchlstwith
|[]->true|h::t->false
![Page 28: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/28.jpg)
Esempi
• letrecsumxs=matchxswith|[]->0|h::t->h+sumt
• letrecconcatss=matchsswith|[]->""|s::ss'->s^(concatss')
• letrecappendlst1lst2=matchlst1with|[]->lst2|h::t->h::(appendtlst2)
![Page 29: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/29.jpg)
PaZernMatching
• matchewith|p1->e1|p2->e2|...|pn->en
• Leespressionipisichiamanopa6ern
![Page 30: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/30.jpg)
PaZernmatching
• IlpaZern[]“match”solamenteilvalore[]• match[]with
|[]->0|h::t->1
(*res%tuisceilvalore0*)• match[]with
|h::t->0|[]->1
(*res%tuisceilvalore1*)
![Page 31: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/31.jpg)
PaZernmatching
• Il pattern h::t “match” una qualsiasi lista con almeno un elemento, e inoltre ha l’effetto di legare quell’elemento alla variabile h e la lista rimanente alla variabile t
• match [1; 2; 3] with | [] -> 0 | h::t -> h (* restituisce il valore 1 *)
• match [1; 2; 3] with | [] -> [] | h::t -> t (* restituisce il valore [2; 3] *)
![Page 32: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/32.jpg)
Altriesempi
• IlpaZerna::[]“match”tuZelelisteconesaZamenteunelemento• IlpaZerna::b“match”tuZelelisteconalmenounelemento• IlpaZerna::b::[]“match”tuZelelisteconesaZamentedueelemen%• IlpaZerna::b::c::d“match”tuZelelisteconalmenotreelemen%
![Page 33: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/33.jpg)
Unesempiopiùcomplicato
• letrecdrop_valvlst=matchlstwith|[]->[]|h::t->lett'=drop_valvtin ifh=vthent'elseh::t'
![Page 34: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/34.jpg)
Unaltroesempio
• let rec max_list = function | [] -> ??? | h::t -> max h (max_list t)
• Cosa mettiamo al posto di ??? ? • min_int è una scelta possibile ... • O sollevare una exception ... • In Java, avremmo potuto restituire null... • …ma siamo in Ocaml, che ci fornisce una altra soluzione
![Page 35: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/35.jpg)
Op%ontype
• let rec max_list = function | [] -> None | h::t -> match max_list t with | None -> Some h | Some x -> Some (max h x)
(* max_list : 'a list -> 'a option *)
![Page 36: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/36.jpg)
Iteratori
• let rec map f = function | [] -> [] | x::xs -> (f x)::(map f xs)
• map : ('a -> 'b) -> 'a list -> 'b list
• let is_even x = (x mod 2 = 0);; • let lst = map is_even [1; 2; 3; 4];;
Parametroimpicitodi%polista
![Page 37: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/37.jpg)
Iteratori
• let rec map f = function | [] -> [] | x::xs -> (f x)::(map f xs)
• map : ('a -> 'b) -> 'a list -> 'b list
• let is_even x = (x mod 2 = 0);; • let lst = map is_even [1; 2; 3; 4];; • Risultato [false; true; false; true]
![Page 38: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/38.jpg)
Definire%pididatoinOCaml
OcamlpermeZealprogrammatoredidefinirenuovi%pididato
type giorno = | Lunedi | Martedi | Mercoledi | Giovedi | Venerdi | Sabato | Domenica
Dichiarazione di tipo
Nome del tipo Costruttori
IcostruZoridefinisconoivaloridel%podidatoSabatoha%pogiorno[Venerdi,Sabato,Domenica]ha%pogiornolist
![Page 39: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/39.jpg)
PaZernmatching
IlpaZernmatchingfornisceunmodoefficienteperaccedereaivaloridiun%podidato
let string_of_g (g : giorno) : string = begin match g with | Lunedi -> "Lunedi" | Martedi -> "Martedi" | : | : | Domenica -> "Domenica" end
IlpaZernmatchingseguelastruZurasintafcadeivaloridel%podidato:icostruZori
![Page 40: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/40.jpg)
Astrazionisuida%
• Avremmo potuto rappresentare il tipo di dato giorno tramite dei semplici valori interi – Lunedi = 1, Martedi = 2, …, Domenica = 7
• Ma… – il tipo di dato primitivo int fornisce un insieme di operazioni differenti
da quelle significative sul tipo di dato giorno, Mercoledi – Domenica non avrebbe alcun senso
– esistono un numero maggiore di valori interi che di valori del tipo giorno
• Morale: I linguaggi di programmazione moderni (Java, C#, C++, Ocaml, …) forniscono strumenti per definire tipi di dato
![Page 41: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/41.jpg)
OcamlType
• IcostruZoripossonotrasportare“valori”
# type foo = | Nothing | Int of int | Pair of int * int | String of string;; type foo = Nothing | Int of int | Pair of int * int | String of string
Nothing Int 3 Pair (4, 5) String "hello"...
Valoridel%pofoo
Dichiarazionedavalutare
Risultato
![Page 42: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/42.jpg)
PaZernmatching
let get_count (f : foo) : int = begin match f with | Nothing -> 0 | Int(n) -> n | Pair(n,m) -> n + m | String(s) -> 0 end
![Page 43: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/43.jpg)
Tipididatoricorsivi
# type tree = | Leaf of int | Node of tree * int * tree;; type tree = Leaf of int | Node of tree * int * tree
let t1 = Leaf 3 let t2 = Node(Leaf 3, 2, Leaf 4) let t3 = Node (Leaf 3, 2, Node (Leaf 5, 4, Leaf 6))
![Page 44: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/44.jpg)
Tipididatoricorsivi
# type tree = | Leaf of int | Node of tree * int * tree;; type tree = Leaf of int | Node of tree * int * tree
Quanti di voi hanno programmato con strutture dati del tipo tree?
![Page 45: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/45.jpg)
Alberibinari
Radice
foglie
SoZoalberosinistro
SoZoalberodestro
vuoto
Liavetevis%aalgoritmica!!!!
![Page 46: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/46.jpg)
AlberibinariinOCaml
type tree = | Empty | Node of tree * int * tree
let t : tree = Node(Node(Empty, 1, Empty), 3 Node(Empty, 2, Node(Empty, 4, Empty)))
3
1 2
4
![Page 47: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/47.jpg)
Ricercainunalbero
let rec contains (t : tree) (n : int) : bool = begin match t with | Empty -> false | Node(lt, x, rt) -> x = n || (contains lt n) || (contains rt n) end
LafunzionecontainseffeZuaunaricercadelvalorensull’alberotCasopeggiore:devevisitaretuZol’albero
![Page 48: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/48.jpg)
Alberibinaridiricerca
Idea:ordinareida%suiqualivienefaZalaricercaUnalberobinariodiricerca(BST)èunalberobinariochedevesoddisfarealcuneproprietàinvarian%addizionali
• Node(lt,x,rt)èunBSTse• ltertsonoBST• tufinodidiltcontengonovalori<x• tufinodidirtcontengonovalori>x
• Empty(l’alberovuoto)èunBST
INVARIANTEDIRAPPRESENTAZIONE
![Page 49: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/49.jpg)
Esempio
L’invariantedirappresentazionedeiBSTèsoddisfaZoComesidimostra?RicordateletecnichecheaveteimparatoaLPP!!!
![Page 50: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/50.jpg)
RicercasuunBST
(*Ipotesi:tèunBST*)letreclookup(t:tree)(n:int):bool=beginmatchtwith|Empty->false|Node(lt,x,rt)->ifx=nthentrueelseifn<xthen(lookupltn)else(lookuprtn)end
Osservazione1:L’invariantedirappresentazioneguidalaricercaOsservazione2:Laricercapuòres%tuirevalorinoncorrefseapplicataaunalberochenonsoddisfal’invariantedirappresentazione
![Page 51: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/51.jpg)
lookup(t,3)
![Page 52: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/52.jpg)
ComecostruiamounBST
• Opzione 1 – costruiamo un albero e poi controlliamo (check) se vale l’invariante di
rappresentazione • Opzione 2
– definire le funzioni che costruiscono BST a partire da BST (ad esempio, la funzione che inserisce un elemento in un BST e restituisce un BST)
– definire una funzione che costruisce il BST vuoto – tutte queste funzioni soddisfano l’invariante di rappresentazione, pertanto “per
costruzione” otteniamo un BST – non si deve effettuare nessun controllo a posteriori!! – questo passo mette in evidenza il ruolo della teoria in informatica (tipi
algebrici): ne parleremo nel seguito del corso
![Page 53: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/53.jpg)
insert(t,4)
![Page 54: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/54.jpg)
insert(t,4)
![Page 55: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/55.jpg)
insert
(*InsertnnelBSTt*)letrecinsert(t:tree)(n:int):tree=beginmatchtwith|Empty->Node(Empty,n,Empty)|Node(lt,x,rt)->
ifx=nthent elseifn<xthenNode(insertltn,x,rt) elseNode(lt,x,insertrtn)
end
Perqualemo%vol’alberocostruitodallafunzioneinsertèunBST?
![Page 56: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/56.jpg)
delete(t,5)
L’operazionedirimozioneèpiùcomplicata:sidevepromuoverelafoglia3aradicedell’albero!!!
![Page 57: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/57.jpg)
Funzioneausiliaria
letrectree_max(t:tree):int=beginmatchtwith|Node(_,x,Empty)->x|Node(_,_,rt)->tree_maxrt|_->failwith"tree_maxcalledonEmpty"end
L’invariantedirappresentazionegaran%scecheilvaloremaxsitrovanellapartepiùadestradell’albero
![Page 58: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/58.jpg)
delete
letrecdelete(t:tree)(n:int):tree=beginmatchtwith|Empty->Empty|Node(lt,x,rt)->
ifx=nthenbeginmatch(lt,rt)with
|(Empty,Empty)->Empty |(Node_,Empty)->lt |(Empty,Node_)->rt |_->letm=tree_maxltin Node(deleteltm,m,rt) end
elseifn<xthenNode(deleteltn,x,rt) elseNode(lt,x,deletertn)
end
![Page 59: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/59.jpg)
Funzionigeneriche
letreclength(l:intlist):int=beginmatchlwith|[]->0|_::tl->1+lengthtlend
letreclength(l:stringlist):int=beginmatchlwith|[]->0|_::tl->1+lengthtlend
Analizziamolafunzionelengthapplicataaintlistestringlist
Lefunzionisonoiden%che,ecceZuatal’annotazionedi%po
![Page 60: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/60.jpg)
GenericiinOCaml
letreclength(l:'alist):int=beginmatchlwith|[]->0|_::tl->1+(lengthtl)end
Lanotazione'alistindicaunalistagenericalength[1;2;3]applicalafunzioneaintlistlength["a";"b";"c"]applicalafunzioneastringlist
![Page 61: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/61.jpg)
Appendgenerico
letrecappend(l1:'alist)(l2:'alist):'alist=beginmatchl1with|[]->l2|h::tl->h::(appendtll2)end
PaZernmatchingpermeZedioperaresu%pigenericihha%po'atlha%po'alist
![Page 62: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/62.jpg)
Genericzip
letreczip(l1:'alist)(l2:'blist):('a*'b)list=beginmatch(l1,l2)with|(h1::t1,h2::t2)->(h1,h2)::(zipt1t2)|_->[]end
Lafunzioneoperasu%pigenericimul%pli(da'aliste'blistverso('a*'b)list)zip[1;2;3]["a";"b";"c"]=[(1,"a");(2,"b");(3,"c")]:(int*string)list
![Page 63: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/63.jpg)
Generictree
type'atree=|Empty|Nodeof'atree*'a*'atree
Sino%l’u%lizzodelparametrodi%po'a
![Page 64: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/64.jpg)
GenericBST
letrecinsert(t:'atree)(n:'a):'atree=beginmatchtwith|Empty->Node(Empty,n,Empty)|Node(lt,x,rt)->
ifx=nthent elseifn<xthenNode(insertltn,x,rt) elseNode(lt,x,insertrtn)
end
Glioperatoridirelazione=e<operanosuogni%podidato
![Page 65: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/65.jpg)
Collec%on(Set)
• Un insieme è una collezione di dati omogenei con operazioni di unione, intersezione, etc.
• Un Set è sostanzialmente una lista nella quale – la struttura d’ordine non è importante – non sono presenti duplicati ma non è un tipo primitivo in Ocaml
• Strutture dati come Set sono usate frequentemente in molte applicazioni – interrogazioni SQL (insieme degli studenti iscritti a Informatica,
insieme dei risultati di una ricerca sul web con Google, insieme dei dati di un esperimento al CERN, …)
• Diversi modi per implementare Set
![Page 66: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/66.jpg)
Set
• UnBSTdefinisceunaimplementazionedellastruZuraSeto l’insiemevuoto(bstempty)o determinaretu@glielemen%cheappartengonoall’insieme(visita
dell’albero)o definireunaoperazionepertestarel’appartenenzadiunelementoa
uninsieme(lookup)o definireunioneeintersezione(tramiteleoperazionidiinsertedelete)
![Page 67: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/67.jpg)
OCaml:SetInterface
moduletypeSet=sigtype'asetvalempty:'asetvaladd:'a->'aset->'asetvalremove:'a->'aset->'asetvallist_to_set:'alist->'asetvalmember:'a->'aset->boolvalelements:'aset->'alistend
Moduletype(inunfile.mli)perdichiarareunTdAsig...endracchiudonounasegnatura,chedefinisceilTdAeleoperazionival:nomedeivalorichedevonoesseredefini%edeiloro%pi
Idea(solita):fornirediversefunzionalitànascondendolaloroimplementazione
![Page 68: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/68.jpg)
ModuliinOCaml
moduleMyset:Set=struct…(*implementa%onsofalltheopera%ons*):end
NomedelmoduloSignaturechedeveessereimplementata
![Page 69: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/69.jpg)
“dotnota%on”
lets1=Myset.add3Myset.emptylets2=Myset.add4Myset.emptylets3=Myset.add4s1lettest():bool=(Myset.member3s1)=true;;run_test"Myset.member3s1"testlettest():bool=(Myset.member4s3)=true;;run_test"Myset.member4s3"test
![Page 70: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/70.jpg)
Openmodule
Alterna%va:aprireloscopedelmodulo(open)perportareinominell’ambientedelprogrammainesecuzione
;;openMysetlets1=add3emptylets2=add4emptylets3=add4s1lettest():bool=(member3s1)=true;;run_test"Myset.member3s1"testlettest():bool=(member4s3)=true;;run_test"Myset.member4s3"test
![Page 71: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/71.jpg)
Implementazionebasatasulist
moduleMySet2:Set=structtype'aset='alistletempty:'aset=[]...end
Una definizione concreta
per il tipo Set
![Page 72: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/72.jpg)
Domande
openMySetlets1:intset=Empty
Superalafasedicontrollodei%pi?
![Page 73: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/73.jpg)
Domande
openMySetlets1:intset=Empty
Superalafasedicontrollodei%pi?No:ilcostuZoreEmptynonèvisibileesternamentealmodulo!!!
![Page 74: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/74.jpg)
CompilareprogrammiOCaml
ocamlc
program.ml (sorgente)
program.cmo (bytecode) a.out (bytecode eseguibile)
hZp://caml.inria.fr/pub/docs/manual-ocaml/comp.html
![Page 75: OCaml: un veloce ripasso - Dipartimento di Informaticapages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI17-18/P2.pdf · o un programma Ocaml è una espressione o una espressione Ocaml denota](https://reader036.vdocuments.site/reader036/viewer/2022071216/604885fe9d6a0a6f4f21fa59/html5/thumbnails/75.jpg)
EseguirebytecodeOCaml
ocamlrun
hZp://caml.inria.fr/pub/docs/manual-ocaml-400/manual024.html
a.out (bytecode eseguibile)
result