Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laziness Renata Carvalho UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Laziness • Lazy evalua*on • Avaliação de uma expressão se dá apenas quando seu valor é necessário f :: Int -‐> Int -‐> Int f a b = a + b f (9-‐3) (f 3 5) = (9-‐3) + (f 3 5) = 6 + 8 = 14 Laziness Chamadas de Cauda Exercícios UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Laziness f :: Int -‐> Int -‐> Int f a b = a + 12 g :: Int -‐> Int g 0 = 0 g c = c + g c f 3 (g 0) = ? f (g 0) 3 = ? Laziness Chamadas de Cauda Exercícios UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Laziness • Argumentos não precisam ser avaliados por completo • Apenas o necessário para a execução da função f :: [Int] -‐> [Int] -‐> [Int] f (a:as) (b:bs) = a + b f [1..] [2..] = ? Laziness Chamadas de Cauda Exercícios UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Laziness • Não faz avaliação duplicada f :: Int -‐> Int -‐> Int f a b = a + b f (9-‐3) (9-‐3) = (9-‐3) + (9-‐3) = + (9-‐3) Expressões representadas como grafos (odmização) Laziness Chamadas de Cauda Exercícios UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Chamadas de Cauda • Resultado é diretamente “retornado” por quem faz a chamada fat n = tailFat n 1 tailFat 0 x = x tailFat n x = tailFat (n-‐1) (n*x) • Tornam desnecessário empilhar um stack frame por chamada • Evitam estouros de pilha • O GHC transforma diversas chamadas “comuns” em chamadas de cauda Laziness Chamadas de Cauda Exercícios UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exercícios • Implemente uma função que dado um valor x, retorna o n-‐ésimo número da sequência de Fibonacci • Você deve usar recursão de cauda • Implemente a função somaLista usando recursão de cauda Laziness Chamadas de Cauda Exercícios
Compartilhar