Programmazione Funzionale Esercizio sulle variabili locali Davide Mottin - Themis Palpanas March 12, 2014 1/9 OCaml Funzioni preparatorie Sommario 2/9 Funzioni preparatorie Costruire una funzione val even : int -> bool = <fun> che restituisca vero se un numero `e pari, falso altrimenti. Creare una funzione odd che calcoli l’opposto di even. OCaml 3/9 Funzioni preparatorie Costruire una funzione val even : int -> bool = <fun> che restituisca vero se un numero `e pari, falso altrimenti. Soluzione let even n = if n mod 2 = 0 then true else false;; Creare una funzione odd che calcoli l’opposto di even. Soluzione let odd n = not (even n);; OCaml 3/9 Un esercizio pi`u complesso Costruire una funzione che stampi ”Pari e divisibile per 3” se un numero in input `e pari e divisibile per tre, altrimenti ”Pari ma non divisibile per 3” oppure ”Dispari e divisibile per 3” e ”Dispari ma non divisibile per 3”. Cercare di utilizzare, ove possibile, dichiarazioni locali. OCaml 4/9 Soluzione ( ∗ P r i n t w h e t h e r a number i s d i v i s i b l e by 2 and by 3 ∗ ) let p r i n t d i v i s i b i l i t y n = i f even n then l e t out = ” P a r i ” in i f n mod 3 = 0 t h e n p r i n t s t r i n g ( out ˆ” e d i v i s i b i l e per 3” ) else p r i n t s t r i n g ( o u t ˆ ” ma non d i v i s i b i l e p e r 3 ” ) else l e t out = ” D i s p a r i ” in i f n mod 3 = 0 t h e n p r i n t s t r i n g ( out ˆ” e d i v i s i b i l e per 3” ) else p r i n t s t r i n g ( o u t ˆ ” ma non d i v i s i b i l e p e r 3 ” ) ; OCaml 5/9 Esercizio Che tipo ha la funzione seguente e a cosa serve? l e t a p p l y f ( n ,m) = ( f n m ) ; ; OCaml 6/9 Esercizio Che tipo ha la funzione seguente e a cosa serve? l e t a p p l y f ( n ,m) = ( f n m ) ; ; Soluzione. (α → β → γ) → α ∗ β → γ Sapete fornire una possibile applicazione di questa funzione? OCaml 6/9 Esercizio Che tipo ha la funzione seguente e a cosa serve? l e t a p p l y f ( n ,m) = ( f n m ) ; ; Soluzione. (α → β → γ) → α ∗ β → γ Sapete fornire una possibile applicazione di questa funzione? Soluzione (possibile). apply (fun x y -> sqrt (x**2.0 +. y**2.0)) (3.,4.);; OCaml 6/9 Esercizio Costruire una funzione conditional apply che, preso in input due funzioni f e g ed un elemento x restituisca g applicata ad x se f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della funzione scritta. OCaml 7/9 Esercizio Costruire una funzione conditional apply che, preso in input due funzioni f e g ed un elemento x restituisca g applicata ad x se f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della funzione scritta. Soluzione let conditional apply f g x = i f f x then g x else x ;; Qual `e il tipo? OCaml 7/9 Esercizio Costruire una funzione conditional apply che, preso in input due funzioni f e g ed un elemento x restituisca g applicata ad x se f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della funzione scritta. Soluzione let conditional apply f g x = i f f x then g x else x ;; Qual `e il tipo? Esercizio. Costruire una funzione to odd che preso in input un valore se `e pari restituisce il suo successore, altrimenti restituisce lo stesso valore. OCaml 7/9 Esercizio Costruire una funzione conditional apply che, preso in input due funzioni f e g ed un elemento x restituisca g applicata ad x se f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della funzione scritta. Soluzione let conditional apply f g x = i f f x then g x else x ;; Qual `e il tipo? Esercizio. Costruire una funzione to odd che preso in input un valore se `e pari restituisce il suo successore, altrimenti restituisce lo stesso valore. Soluzione (possibile). let to odd x = conditional apply even succ x;; OCaml 7/9 Altri Esercizi Costruire una funzione che restituisca la funzione della retta dato in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi. OCaml 8/9 Altri Esercizi Costruire una funzione che restituisca la funzione della retta dato in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi. Soluzione l e t l i n e m q x = m∗ . x +. q ; ; OCaml 8/9 Altri Esercizi Costruire una funzione che restituisca la funzione della retta dato in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi. Soluzione l e t l i n e m q x = m∗ . x +. q ; ; Esercizio Usando la funzione precedente costruire una funzione che dato in input due punti restituisce la funzione della retta passante per essi. −y1 1 y2 Dato (x1 , y1 ) e (x2 , y2 ) m = xy22 −x , q = y1 xx22 −x −x1 1 OCaml 8/9 Altri Esercizi Costruire una funzione che restituisca la funzione della retta dato in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi. Soluzione l e t l i n e m q x = m∗ . x +. q ; ; Esercizio Usando la funzione precedente costruire una funzione che dato in input due punti restituisce la funzione della retta passante per essi. −y1 1 y2 Dato (x1 , y1 ) e (x2 , y2 ) m = xy22 −x , q = y1 xx22 −x −x1 1 Soluzione l e t l i n e e q u a t i o n x ( x1 , y1 ) ( x2 , y2 ) = l i n e ( ( y2 −. y1 ) / . ( x2 −. x1 ) ) ( ( y1 ∗ . x2 −. x1 ∗ . y2 ) / . ( x2 −. x1 ) ) x ; ; OCaml 8/9 Altri Esercizi - 2 Costruire una funzione che preso in input due funzioni e una coppia (x,y) controlli se si intersecano in (x,y) OCaml 9/9 Altri Esercizi - 2 Costruire una funzione che preso in input due funzioni e una coppia (x,y) controlli se si intersecano in (x,y) Soluzione let intersect in l1 l2 (x , y) = ( l 1 x = y ) && ( l 2 x = y ) ; ; OCaml 9/9 Altri Esercizi - 2 Costruire una funzione che preso in input due funzioni e una coppia (x,y) controlli se si intersecano in (x,y) Soluzione let intersect in l1 l2 (x , y) = ( l 1 x = y ) && ( l 2 x = y ) ; ; Esercizio Costruire una funzione che calcoli il baricentro tra tre punti. OCaml 9/9 Altri Esercizi - 2 Costruire una funzione che preso in input due funzioni e una coppia (x,y) controlli se si intersecano in (x,y) Soluzione let intersect in l1 l2 (x , y) = ( l 1 x = y ) && ( l 2 x = y ) ; ; Esercizio Costruire una funzione che calcoli il baricentro tra tre punti. Soluzione l e t b a r y c e n t e r ( x1 , y1 ) ( x2 , y2 ) ( x3 , y3 ) = ( ( x1 +. x2 +. x3 ) / . 3 . , ( y1 +. y2 +. y3 ) / . 3 . ) ; ; OCaml 9/9
© Copyright 2024 ExpyDoc