Haskell Programação Funcional

15
Haskell Programação Funcional Diego Lima Marcelo Costa

description

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. - PowerPoint PPT Presentation

Transcript of Haskell Programação Funcional

Page 1: Haskell Programação Funcional

HaskellProgramação Funcional

Diego LimaMarcelo Costa

Page 2: Haskell Programação Funcional

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

Page 3: Haskell Programação Funcional

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

Page 4: Haskell Programação Funcional

Exemplo

• Obter os n primeiros elementos de uma lista– primeirosN :: [Int] -> Int -> [Int]

• Verificar se um elemento pertence a lista– Pertence :: Int -> [Int] -> Bool

Page 5: Haskell Programação Funcional

Exemplo

• filtragem: apenas os números de uma string– digits :: String -> String

• soma de uma lista de pares– sumPairs :: [(Int,Int)]->[Int]

Page 6: Haskell Programação Funcional

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]

Page 7: Haskell Programação Funcional

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 bsmyZip [] [] = []

Page 8: Haskell Programação Funcional

Exemplo

• Função myLength– myLength :: [t] -> Int

• Operador concatenação de lista– (&&&) :: [t] -> [t] -> [t]

Page 9: Haskell Programação Funcional

Definições Locais

Resolução bottom-up e top-down• sumQuadrados :: Int -> Int -> Int

sumQuadrados a b = sqA + sqBwhere sqA = a * a

sqB = b * b

sumQuadrados a b = sq a + sq bwhere sq x = x * x

Page 10: Haskell Programação Funcional

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

Page 11: Haskell Programação Funcional

CASE

firstDigit :: String -> CharfirstDigit st = case (digits st) of

[] -> '\0'(a:as) -> a

Page 12: Haskell Programação Funcional

IF THEN ELSE

ehStringTal :: String -> Int -> BoolehStringTal str a = if str == "oi" then True

else if str == "joao" then if a == 3 then False else True

else False

Page 13: Haskell Programação Funcional

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]

Page 14: Haskell Programação Funcional

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)

Page 15: Haskell Programação Funcional

EXERCICIOS

• dropSpace :: String -> String• getWord :: String -> String• dropWord :: String -> String• splitWord :: String -> [String]