haskell :: funções como valores

19
Haskell :: Funções como valores George Darmiton da Cunha Cavalcanti ([email protected]) Monitores: Bruno Barros (blbs @ cin.ufpe.br) Glerter Sabiá (gas2 @ cin.ufpe.br) Thiago Lacerda (tbl2 @ cin.ufpe.br)

Upload: lydia

Post on 22-Jan-2016

40 views

Category:

Documents


0 download

DESCRIPTION

Haskell :: Funções como valores. George Darmiton da Cunha Cavalcanti ([email protected]). Monitores: Bruno Barros (blbs @ cin.ufpe.br) Glerter Sabiá (gas2 @ cin.ufpe.br) Thiago Lacerda (tbl2 @ cin.ufpe.br). Composição de funções. Estruturar programas compondo funções type Word = String - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Haskell :: Funções como valores

Haskell :: Funções como valores

George Darmiton da Cunha Cavalcanti([email protected])

Monitores:

Bruno Barros (blbs @ cin.ufpe.br)

Glerter Sabiá (gas2 @ cin.ufpe.br)

Thiago Lacerda (tbl2 @ cin.ufpe.br)

Page 2: Haskell :: Funções como valores

Composição de funções

Estruturar programas compondo funções

type Word = Stringtype Line = [Word]

fill :: String -> [Line]fill st = splitLines (splitWords st)

splitWords :: String -> [Word]splitLines :: [Word] -> [Line]

fill = splitLines . splitWords

Page 3: Haskell :: Funções como valores

A função de composição

(f . g) x = f (g x)

u vg f

g >.> f

t

f . g

Page 4: Haskell :: Funções como valores

A função de composição

(.) :: (u -> v) -> (t -> u) -> (t -> v)

(.) f g x = f (g x)

a composição é associativa

Page 5: Haskell :: Funções como valores

Composição para a frente

(>.>) :: (t -> u) -> (u -> v) -> (t -> v)

g >.> f = f . g

(g >.> f) x = (f . g) x = f (g x)

fill = splitWords >.> splitLines

Page 6: Haskell :: Funções como valores

Resultados

twice :: (t -> t) -> (t -> t)

twice f = f . f

(twice succ) 12= (succ . succ) 12= succ (succ 12)= 14

Page 7: Haskell :: Funções como valores

Resultados

Generalizar twicetwice passando um argumento que diz o número de vezes que a função-argumento será composta com ela mesma:

iter :: Int -> (t -> t) -> (t -> t)iter :: Int -> (t -> t) -> (t -> t)

iter 0 f = iditer 0 f = id

iter n f = f >.> iter (n-1) fiter n f = f >.> iter (n-1) f

Page 8: Haskell :: Funções como valores

Expressões que definem funções

listMult :: Int -> (Int -> [Int])

listMult n = f where f m = [m*1,m*2..,m*n]

Notação Lambda(\m -> 3+m)

addNum n = (\m -> [m*1,m*2..m*n])

Page 9: Haskell :: Funções como valores

comp2 :: (t -> u) -> (u -> u -> v) ->

(t -> t -> v)

comp2 f g = (\x y -> g (f x) (f y))

\x y -> g (f x) (f y)

y

f

f

g g (f x) (f y)

comp2x

Page 10: Haskell :: Funções como valores

Associatividade

f a b = (f a) b f a b f (a b)

t -> u -> v = t -> (u -> v) t -> u -> v (t -> u) -> v

g :: (Int -> Int) -> Intg h = h 0 + h 1

Page 11: Haskell :: Funções como valores

Currying (currificação)

curry :: ((t,u) -> v) -> (t -> u -> v)

curry g a b = g (a,b)

uncurry :: (t -> u -> v) -> ((t,u) -> v)

uncurry f (a,b) = f a b

flip :: (t -> u -> v) -> (u -> t -> v)

flip f b a = f a b

Page 12: Haskell :: Funções como valores

Haskell :: Um Interpretador para Exp1

George Darmiton da Cunha Cavalcanti([email protected])

Monitores:

Bruno Barros (blbs @ cin.ufpe.br)

Glerter Sabiá (gas2 @ cin.ufpe.br)

Thiago Lacerda (tbl2 @ cin.ufpe.br)

Page 13: Haskell :: Funções como valores

Linguagem Exp1

Inclui apenas valores constantes (literais) e operações sobre valores

Valores e operações sobre inteiros, booleanos e string são admitidos

Um programa é uma expressão

Agrupa valores em tipos e uma verificação de tipos pode ser implementada

Page 14: Haskell :: Funções como valores

Sintaxe Abstrata de Exp1

Programa ::= Expressao

Expressao ::= Valor | ExpUnaria | ExpBinaria

Valor ::= ValorConcreto

ValorConcreto ::= ValorInteiro| ValorBooleano

| ValorString

ExpUnaria ::= "-" Expressao | "not"

Expressao | "length"

Expressao

ExpBinaria ::=

Expressao "+" Expressao| Expressao "-" Expressao| Expressao "and" Expressao| Expressao "or" Expressao| Expressao "==" Expressao| Expressao "++" Expressao

Page 15: Haskell :: Funções como valores

Programas de Exp1

Programa 14

Programa 24 + 5

Programa 3(5+(-2))-3

Page 16: Haskell :: Funções como valores

Sintaxe Abstrata de Exp1

data Programa = PROG Expressao

data Expressao = LIT Valor

-- ExpUnaria| MINUS Expressao| NOT Expressao| LENGTH Expressao

-- ExpBinaria| SOMA Expressao Expressao| SUBTRACAO Expressao Expressao| AND Expressao Expressao| OR Expressao Expressao| IGUAL Expressao Expressao| CONCATENA Expressao Expressao

Page 17: Haskell :: Funções como valores

Exemplos de programas Exp1

p1 = PROG (LIT (V_INT 4))

p2 = PROG (SOMA (LIT (V_INT 4)) (LIT (V_INT 5)))

...

Page 18: Haskell :: Funções como valores

Entidades Semânticas

Valores

data Valor = V_INT Int | V_BOOL Bool | V_STR String

instance Show Valor where

show (V_INT int) = (show int)

show (V_BOOL bool) = (show bool)

show (V_STR str) = (show str)

Page 19: Haskell :: Funções como valores

Função de Interpretação

interprete :: Programa -> Stringinterprete (PROG e) = show (eval e)

-- Funcao de Avaliacao de Expressoes

eval :: Expressao -> Valoreval (LIT i) = ieval (NOT e) = not (eval e)eval (SOMA e1 e2) = (eval e1) + (eval e2)...