Lista de Exercícios: Haskell Básico¶
Esta página contém todas as listas de exercícios práticos da Unidade 1, servindo como material de estudo e fixação dos conceitos fundamentais de Haskell.
📘 Lista 1: Funções Básicas e Recursão em Haskell¶
Conteúdo: https://profsergiocosta.notion.site/3-Fun-es-c7eaa942530f4ccbaadd0aed2f9ec13e
1. Funções básicas¶
- Defina uma função
quadque receba um número e devolva o seu quadrado. - Escreva uma função
hipotenusaque receba os catetos de um triângulo retângulo e devolva a hipotenusa.- Dica: use
sqrt.
- Dica: use
2. Definições locais (where e let)¶
- Reescreva a função
hipotenusausandowherepara definir variáveis auxiliares. - Reescreva a mesma função usando
let … in ….
3. Condicionais e guards¶
- Defina a função
sinalusandoif-then-elseque devolva:1se o número for negativo0se for zero1se for positivo
- Reescreva a função
sinalusando guards. - Implemente a função
classificaNotaque recebe um número (0–10) e retorna:"Reprovado"se menor que 5"Recuperação"se entre 5 e 6.9"Aprovado"se maior ou igual a 7.
4. Pattern Matching¶
- Reescreva a função
negar :: Bool -> Boolusando pattern matching. - Defina a função
diasSemanaque recebe um número de 1 a 7 e retorna o nome do dia correspondente (1 → "Domingo", 2 → "Segunda", etc.).- Use padrões explícitos.
- Defina a função fatorial com pattern matching nos casos base.
5. Recursão¶
- Implemente a função
potencia b eque calcula beb^ebe usando recursão (sem usar(^)). - Escreva uma função
mdc a bque calcule o máximo divisor comum (algoritmo de Euclides). - Defina a sequência de Fibonacci de forma recursiva simples.
- Refaça a função de Fibonacci usando a técnica de recursão em cauda.
📙 Lista 2: Listas e Compreensão em Haskell¶
1. Definição e Criação de Listas¶
- Escreva manualmente a lista
[5,6,7]usando apenas o construtor(:). - Use syntax sugar para criar:
- a lista de números de 1 a 20.
- a lista de números pares de 0 a 20.
- a lista de múltiplos de 3 de 0 a 30.
- Represente a string
"HASKELL"como lista de caracteres.
2. Funções e Operadores sobre Listas¶
- Dada a lista
lista = [10..20], calcule:head listatail listatake 5 listadrop 7 listalista !! 3
- Escreva expressões em Haskell que retornem:
- o tamanho da lista
[1..100]. - a soma dos números de 1 a 50.
- o produto dos números de 1 a 5.
- o tamanho da lista
- Mostre duas formas diferentes de construir a lista
[1..10]a partir da concatenação de sublistas.
3. Pattern Matching¶
- Implemente uma função
primeiroOuZero :: [Int] -> Intque retorna o primeiro elemento da lista, ou0se a lista for vazia. - Implemente uma função
segundoElemento :: [a] -> Maybe aque retorna o segundo elemento de uma lista (ouNothingse não existir).
4. Recursão em Listas¶
- Implemente a função
meuLength :: [a] -> Intque calcula o tamanho de uma lista usando recursão. - Implemente a função
meuSum :: Num a => [a] -> aque soma os elementos de uma lista usando recursão. - Reescreva a função
reverseutilizando recursão. - Implemente a função
meuDrop :: Int -> [a] -> [a], removendo osnprimeiros elementos de uma lista.
5. Funções com Vários Argumentos¶
- Implemente a função
meuZip :: [a] -> [b] -> [(a,b)]que une duas listas em uma lista de pares. - Teste sua função
meuZipcom as listas[1,2,3]e['a','b','c'].
6. Compreensão de Listas¶
- Gere, usando compreensão de listas:
- uma lista com os quadrados dos números de 1 a 10.
- uma lista com apenas os números pares de 1 a 20.
- o produto cartesiano entre
[1,2,3]e[‘a’,’b’]. - Defina a função
divisores :: Int -> [Int]que retorna a lista de todos os divisores de um número. - Defina a função
ehPrimo :: Int -> Boolque verifica se um número é primo usandodivisores. - Usando compreensão de listas, gere todos os pares
(x,y)com1 <= x < y <= 10tais quex + yseja par.
📗 Lista 3: Funções de Alta Ordem e Composição¶
Parte 1 – Aquecendo com HOFs¶
- Defina a função
duasVezes :: (a -> a) -> a -> ae teste com:duasVezes (*3) 2duasVezes reverse [1,2,3]
- Usando aplicação parcial, defina:
triplica = (*3)-
mais10 = (+10)Teste essas funções em valores diferentes.
Parte 2 – Map¶
- Use
mappara:- Somar 1 a todos os elementos da lista
[10,20,30] - Converter todos os números de
[1..5]em valores booleanos indicando se são pares.
- Somar 1 a todos os elementos da lista
- Defina uma função
maiusculas :: [String] -> [String]que transforma todas as palavras de uma lista em maiúsculas usandomap.
Parte 3 – Filter¶
- Use
filterpara:- Selecionar apenas os números maiores que 100 da lista
[50,150,200,80,120]. - Remover os espaços em branco de uma string.
- Selecionar apenas os números maiores que 100 da lista
-
Combine
mapefilter:Defina
quadradosPares :: [Int] -> [Int]que devolve os quadrados apenas dos números pares de uma lista.
Parte 4 – Fold (Reduce)¶
- Reescreva com
foldr:- A soma (
sum) de uma lista - O produto (
product) de uma lista - O tamanho (
length) de uma lista
- A soma (
- Defina uma função
concatena :: [String] -> Stringusandofoldrque junte todas as strings de uma lista em uma só.
Parte 5 – Outras HOFs¶
- Use:
allpara verificar se todos os números de[2,4,6,8]são pares.anypara verificar se há algum múltiplo de 7 em[10..20].takeWhilepara pegar os primeiros números pares de[2,4,6,7,8,10].dropWhilepara descartar os primeiros números pares da mesma lista.
Parte 6 – Composição¶
- Defina
dobroMaisUm = (+1) . (*2)e teste em[1..5]commap. - Escreva uma função
processaLista :: [Int] -> [Int]que: - multiplique todos os números por 2,
- some 1,
-
filtre apenas os números maiores que 10.
Use composição para encadear os passos.
-
(Desafio) Defina
compose :: [a -> a] -> (a -> a)que recebe uma lista de funções e retorna a composição delas.Teste com: