7/16/20151 Haskell: Tipi basici e Definizioni n Tipi Atomici (scalari) n Valori e Identificatori n Overloading n Definizioni e Layout n Definizioni ricorsive: Astrazione e Fix Astrazione e FixAstrazione e Fix n Funzioni: operatori infissi, associativi, priorità n Esempi di programmi n Esercizi
7/16/20152 Tipi Atomici n Int –S. (usuale): sequenze di cifre decimali –O.: +, *, -, div, ^, mod, … n Float –S. (usuale): coppie di interi separate da `.` –O.: +, *, -, /, ^, **, abs,… n Char –S. (usuale): `a`, `Z`, `\t`,.., `\n` (ASCII) –Oper.: >,, <,…, ==,…, ord, chr, … n Bool –S.: True, False –O.: ||, &&, not n Operatori Relazionali: T -> T-> Bool
7/16/20153 Valori e Identificatori n Identificatori introducono valori n Quanti diversi usi: n I. di moduli: Capital Letter n I. di classi di tipi: Capital Letter n I. di funzioni, val. funzionali, valori: Lower case n I. di parametri: Lower case
7/16/20154 Overloading n +: Int -> Int -> Int +: Float -> Float -> Float ==: Int -> Int -> Bool ==: Char -> Char -> Bool ==: Int -> Int -> Bool ==: Char -> Char -> Bool n Classi di Tipi
7/16/20155 Definizioni n Definizioni –D. con guardie (equazione condizionale) »Ide x1…xn | g1= e1 … | gk = ek –D. con equazioni: »Ide pattern1,1 … pattern1,n = e1 …. Ide patternk,1 … patternk,n = ek –D. per astrazione »Ide = \x1 -> … \xn -> if b1 then e1 else … else ek
7/16/20156 Esempio f:: Int -> Int -> Int f 0 0 = 0 f 0 y | y == 2= 5 | y == 8 = 12 | otherwise= y f x y = 2*x+(y ^ 4) g:: Int -> Int -> Int g = \x -> \ y -> if (x>=y) then 5 else (f x y) Calcoliamo
7/16/20157 Definizioni: Layout n Cos’è un layout in Haskell –Regione che contiene una definizione –Separa definizioni distinte –Individuato dalle coordinate della prima lettera della definizione f 0 0 = 0 f 0 y | y == 2= 5 | y == 8 = 12 | otherwise = y g:: Int -> Int -> Int n Separatori “grafici” di definizioni: sintatticamente sta per “;” sta per “;”sta per “;”
7/16/20158 Funzioni: Operatori infissi, associatività, priorità n Funzioni come operatori binari –Infix [n] op –Infixl [n] op –Infixr [n] op con [x] = opzionale x, n [0..9]op = {!,#,+,*,…} + infixr infixr 8 *** +++:: Int -> Int -> Int ***:: Int -> Int -> Int (+++) = (+) (***) = (*)
7/16/20159 Definizioni ricorsive: operatore Fix n Equazioni ricorsive: »Fact = \n -> if n==0 then 1 else n*Fact(n-1) »Fact n = if n==0 then 1 else n*Fact(n-1) –Introducono »Metodologia: definizioni induttive n Fact n = Fact(n-1) * n »Semantica: operatore Fix - minimo punto fisso n Fact = Yf(\f -> \n -> if n==0 then 1 else n*f (n-1)) –(contratta in) Fact = Yf \n -> if n==0 then 1 else n*f (n-1) –min f::N->N (Y Fact) n = Fact(Y Fact) n
7/16/ Esempi di programmi n Modulo Fact.hs Fact.hs »Cinque modi di esprimere il fattoriale »Introduzione ai patterns
7/16/ Esercizi n quoziente, resto divisione intera n Modulo Fib.hs: Fib.hs »GCD »N-esimo di Fibonacci (non lineare) »Combinazioni (n k) q:: Int -> Int -> Int q n m | n<m = 0 | n<m = 0 | otherwise = 1 + q (n-m) m | otherwise = 1 + q (n-m) m r :: Int -> Int -> Int r n m | n<m = n | n<m = n | otherwise = q (n-m) m | otherwise = q (n-m) m
7/16/ Briciole: PR & GR Primitive Ricorsive v.s. Generali Base: zero k, succ, identità k PR Base: zero k, succ, identità k PR Derivate: f da g,h PR Derivate: f da g,h PR f(0,x 2,…,x n ) = g(x 2,…,x n ) f(x 1 +1,x 2,…,x n ) = h(x 1,f(x 1,x 2,…,x n ),x 2,…,x n ) Base: PR GR Base: PR GR Derivate: f da h per GR Derivate: f da h per GR f(x 1,x 2,…,x n ) = y [h(y,x 1,x 2,…,x n )=0] where y h x 1 x 2 …x n = y h 0 x 1 x 2 …x n where where y h y x 1 x 2 …x n y h y x 1 x 2 …x n | h y x 1 x 2 …x n == 0= y | otherwise= y h (succ y) x 1 x 2 …x n
7/16/ subtract subtract n m = y (m+y==n) where (x==x) = 0 (x+1==y+1) = (x==y) (x+1==0) = 1 (0==y+1) = 1