Você está na página 1de 16

Haskell

Programao Funcional
Diego Lima Marcelo Costa

Funes - Recurso
Problema: somar os elementos de uma lista sumList :: [Int] -> Int Soluo: Recurso
caso base: lista vazia [] sumList [] = 0 caso recursivo: lista tem cabea e cauda sumList (a:as) = a + sumList as

Funes - Recurso
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

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

Verificar se um elemento pertence a lista


Pertence :: Int -> [Int] -> Bool

Exemplo
filtragem: apenas os nmeros de uma string
digits :: String -> String

soma de uma lista de pares


sumPairs :: [(Int,Int)]->[Int]

Exemplo
SORT Insere um elemento na lista verificando se [e menor que o prximo.
ins :: Int -> [Int] -> [Int]

Ordena uma lista de Int iSort :: [Int] -> [Int]

Polimorfismo
Funes que recebem um tipo genrico Mesma definio usada para vrios tipos

myZip :: [t] -> [u] -> [(t,u)] myZip (a:as) (b:bs) = (a,b):zip as bs myZip [] [] = []

Exemplo
Funo myLength
myLength :: [t] -> Int

Operador concatenao de lista


(&&&) :: [t] -> [t] -> [t]

Definies Locais
Resoluo bottom-up e top-down
sumQuadrados :: Int -> Int -> Int
sumQuadrados a b = sqA + sqB where sqA = a * a sqB = b * b sumQuadrados a b = sq a + sq b where sq x = x * x

Definies Locais
Resoluo 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

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

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

EXERCICIOS
maior: recebe uma lista de nmeros e retorna o maior. obs.: no usar a funo max
maior :: [Int] -> Int

gera-sequencia: recebe um nmero inteiro n positivo e retorna a lista [1, -1, 2, -2, 3, -3, ... n, -n] gera_sequencia :: Int -> [Int]

EXERCICIOS
rodar-esquerda: recebe um nmero natural, uma lista e retorna uma nova lista onde a posio 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)

EXERCICIOS
dropSpace :: String -> String
Apaga todos os espaos do comeo de uma String

getWord :: String -> String


Retorna a primeira palavra de uma string

EXERCICIOS
dropWord :: String -> String
Apaga a primeira palavra de uma string

splitWord :: String -> [String]


Retorna uma lista de String onde cada elemento da lista uma palavra da String de entrada

Você também pode gostar