1 / 15

Haskell Programação Funcional

Haskell Programação Funcional. Diego Lima Marcelo Costa. Funções - Recursão. Problema: somar os elementos de uma lista sumList :: [Int] -> Int Solução: Recursão caso base: lista vazia [] sumList [] = 0 caso recursivo: lista tem cabeça e cauda sumList (a:as) = a + sumList as.

claus
Télécharger la présentation

Haskell Programação Funcional

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. HaskellProgramação Funcional Diego Lima Marcelo Costa

  2. Funções - Recursão • Problema: somar os elementos de uma lista • sumList :: [Int] -> Int • Solução: Recursão • caso base: lista vazia [] • sumList [] = 0 • caso recursivo: lista tem cabeça e cauda • sumList (a:as) = a + sumList as

  3. Funções - Recursão sumList [2,3,4,5] = 2 + sumList [3,4,5] = 2 + (3 + sumList [4,5]) = 2 + (3 + (4 + sumList [5])) = 2 + (3 + (4 + (5 + sumList []))) = 2 + (3 + (4 + (5 + 0))) = 14

  4. Exemplo • Obter os n primeiros elementos de uma lista • primeirosN :: [Int] -> Int -> [Int] • Verificar se um elemento pertence a lista • Pertence :: Int -> [Int] -> Bool

  5. Exemplo • filtragem: apenas os números de uma string • digits :: String -> String • soma de uma lista de pares • sumPairs :: [(Int,Int)]->[Int]

  6. Exemplo SORT • Insere um elemento na lista verificando se [e menor que o próximo. • ins :: Int -> [Int] -> [Int] Ordena uma lista de Int • iSort :: [Int] -> [Int]

  7. Polimorfismo • Funções que recebem um tipo genérico • Mesma definição usada para vários tipos myZip :: [t] -> [u] -> [(t,u)] myZip (a:as) (b:bs) = (a,b):zip as bs myZip [] [] = []

  8. Exemplo • Função myLength • myLength :: [t] -> Int • Operador concatenação de lista • (&&&) :: [t] -> [t] -> [t]

  9. Definições Locais Resolução bottom-up e top-down • sumQuadrados :: Int -> Int -> Int sumQuadrados a b = sqA + sqB wheresqA = a * a sqB = b * b sumQuadrados a b = sq a + sq b wheresq x = x * x

  10. Definições Locais Resolução bottom-up e top-down • sumQuadrados :: Int -> Int -> Int sumQuadrados a b = let sqA = a*a sqB = b*b in sqA + sqB sumQuadrados a b = let sq z = z*z in sq a + sq b

  11. CASE firstDigit :: String -> Char firstDigit st = case (digits st) of [] -> '\0' (a:as) -> a

  12. IF THEN ELSE ehStringTal :: String -> Int -> Bool ehStringTal str a = if str == "oi" then True else if str == "joao" then if a == 3 then False else True else False

  13. EXERCICIOS • maior: recebe uma lista de números e retorna o maior. obs.: não usar a função max • maior :: [Int] -> Int • gera-sequencia: recebe um número inteiro n positivo e retorna a lista [1, -1, 2, -2, 3, -3, ... n, -n] • gera_sequencia :: Int -> [Int]

  14. EXERCICIOS • rodar-esquerda: recebe um número natural, uma lista e retorna uma nova lista onde a posição dos elementos mudou como se eles tivessem sido "rodados” ex.: • (rodar_esquerda 0 '(a s d f g)) ==> (a s d f g) (rodar_esquerda 1 '(a s d f g)) ==> (s d f g a) • (rodar_esquerda 3 '(a s d f g)) ==> (f g a s d) (rodar_esquerda 4 '(a s d f g)) ==> (g a s d f)

  15. EXERCICIOS

More Related