Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo
Pesquisa Binária pesquisa binária -- pesqbin k xs = if null xs then False else if k == pivot then True else if k < pivot then pesqbin k menores else pesqbin k maiores where p = div (length xs) 2 menores = take p xs maiores = tail (drop p xs) pivot = head (drop p xs)
Funções de segunda ordem Quando pelo menos um dos argumentos da função é uma função Exemplos: – sublista prop xs (elaborado em sala!) – takeWhile prop xs: primitiva do Prelude que gera uma lista dos elementos de xs enquanto prop for satisfeita. Exemplo: takeWhile (<3) [2,3,1,4] – dropWhile prop xs: a sublista de xs obtida a partir do primeiro elemento que não satisfaz prop. dropWhile (<3) [2,3,1,4]
Paradigma aplicativo observamos que uma situação frequente na resolução de problemas é a necessidade de aplicar, de forma cumulativa, uma função à uma coleção de elementos. estilos utilizados para isso: Recursão Mecanismos de repetição (em linguagens procedurais) aplicativo (em linguagens funcionais): usado quando desejamos generalizar uma operação para todos os elementos de uma lista.
Exemplo: soma dos elementos de uma lista expressãonova expressãoredução + [5, 9, 3, 8, 15, 16]+ [14, 3, 8, 15, 16]5 + 9 = 14 + [14, 3, 8, 15, 16]+ [14, 11, 15, 16]3 + 8 = 11 + [14, 11, 15, 16]+ [14, 11, 31] = 31 + [14, 11, 31]+ [25, 31] = 25 + [25, 31]+ [56] = 56 + [56]56 Expressãonova expressãoRedução + [5, 9, 3, 8, 15, 16]+ [14, 3, 8, 15, 16]5 + 9 = 14 + [14, 3, 8, 15, 16]+ [17, 8, 15, 16] = 17 + [17, 8, 15, 16]+ [25, 15, 16] = 25 + [25, 15, 16]+ [40, 16] = 40 + [40, 16]+ [56] = 56 + [56]56
A função foldl A função de segunda ordem que utilizaremos para o estilo aplicativo se chama foldl Sintaxe: foldl valor especial: é tomado como ponto de partida para as reduções. A primeira aplicação da operação é sobre o valor especial e o primeiro elemento da lista.
Exemplos Soma dos elementos de uma lista: sum xs = foldl (+) 0 xs Produto dos elementos de uma lista: product xs = foldl (*) 1 xs O operador && aplicado aos elementos de uma lista (conjunção lógica): and xs = foldl (&&) True xs O operador || aplicado aos elementos de uma lista (disjunção lógica): or xs = foldl (||) False xs
Outros Exemplos Menor elemento de uma lista: menorL xs = foldl menor (head xs)xs Ordenação de uma lista, usando inserção ordenada: ordena xs = foldl insord [] xs insord xs x = takeWhile (< x) xs ++ [x] ++ dropWhile (< x) xs