Repository to study and implement exercises done in haskell introductory course.
Escreva a resposta dos exercícios abaixo no código lista01/src/Main.hs
antes da função main
. Para testar, adicione uma linha a função main
da seguinte forma:
main = do
putStrLn "Hello World"
print $ funcao parametro
Os exercícios que não necessitam de implementação devem ser deixados em forma de comentários. Exemplo de código contendo a resposta dos exercícios 1a, 2a e 6a:
{-
Exercicio 01:
1.2 :: Floating a => a
-}
{-
Exercício 02:
subtrair :: Integral a => a -> a -> a
-}
-- Exercício 06
maximo :: Ord a => a -> a -> a
maximo x y = if x > y then x else y
minimo :: Ord a => a -> a -> a
minimo x y = if x < y then x else y
main :: IO ()
main = do
print $ maximo 4 2
print $ minimo 4 2
Para testar o programa basta fazer no prompt de comando do terminal no diretório lista01:
stack run
- Sem utilizar qualquer ajuda, determine o Tipo das seguintes expressões. Depois, utilize o ghci para confirmar suas respostas.
1.2
[1, 2]
(1, 2)
"1, 2"
'🤔'
- Defina as assinaturas de tipo e implemente as funções abaixo:
- Função
subtrair
, que recebe dois valores inteiros e retorna a diferença do primeiro pelo segundo - Função
dobro
, que recebe um valor inteiro e retorna o seu dobro - Função
quad
, que recebe um valor inteiro e retorna seu quadrado - Função
cumprimentar
, que recebe um nome e retorna "Olá nome" (considere o operador de concatenação++
) - Função
aniversario
, que recebe um ano de nascimento e retorna a string "Você fará __ anos em 2020!"
-
Considere um algoritmo de hashing criptográfico (md5, sha2) é utilizado para criptografar textos, transformando-os em sequências de caracteres embaralhadas, aparentemente "aleatórias". Qual seria o tipo dessa função em Haskell?
-
Você foi contratado para desenvolver um jogo de cartas online, em Haskell. Uma carta é definida por
(Char, Char)
, em que o primeiro é o valor da carta (2-9
,0
,J
,Q
,K
,A
) e o segundo representa o naipe (♠
,♦
,♣
,♥
). Considere que não existe Coringa. Escreva uma função que compute o valor de uma carta em um jogo de buraco:
- 3-7 valem 5
- 8-K valem 10
- 2 vale 10
- A vale 15
- Faça uma função
Int -> String
que receba um número e retorne o seu correspondente no desafio FizzBuzz. Considere usar as funçõesshow
emod
. Exemplos:
fb 1 == "1"
fb 3 == "Fizz"
fb 5 == "Buzz"
fb 15 == "FizzBuzz"
- Defina as assinaturas e implemente as funções abaixo:
- Função
maximo
eminimo
, que retornam o maior e menor valor, respectivamente - Função
media
, que retorna o valor médio entre dois valores numéricos - Função
xou
, que realiza a operação "ou exclusivo" em dois booleanos - Função
ehQuadradoPerfeito :: Int -> Bool
que determina se um número é quadrado perfeito (considere a funçãofromIntegral
) - Função
ehSaudavel :: Int -> Bool -> Bool -> Bool
que receba idade (Int), se come pizzas (Bool), se faz exercícios de manhã (Bool) e retorne um Bool de acordo com a árvore abaixo
- Dê o tipo das expressões abaixo, e verifique no ghci
[1,2,3]
[1.0, 2.5]
['o', 'l', 'a']
"ola"
[(3, True, 'b'), (10, False, 'Ç')]
[]
[[]]
[[], []]
- Gere as seguintes listas utilizando ranges
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
[2,4,6,8,10,12,14,16,18,20]
"abcdefghijklmnopqrstuvwxyz"
"KLMNOPQRSTUVWXYZ"
- Faça funções
Int -> [String]
que recebam um valorn
de entrada e retornem uma lista com osn
primeiros números:
- Naturais:
naturais 3 == [0, 1, 2]
- Pares positivos:
pp 3 == [2, 4, 6]
- Naturais, mas em ordem decrescente:
natdesc 3 == [2, 1, 0]
- Defina as assinaturas e implemente as funções abaixo:
isHead a as
que retorna se o elementoa
é o primeiro da listaas
isSecond a as
que retorna se o elementoa
é o segundo da listaas
isAt n a as
que retorna se o elementoa
está nan
-ésima posição da listaas
penultimo as
que retorna o penultimo elemento da listaas
mediaLista as
que retorna o valor médio da listaas
-
Defina uma função
mediaJusta
que recebe uma lista ordenada deFloat
, descarta o maior e o menor, e então calcula a média -
Defina uma função
mediaGlobal
que receba uma[[Float]]
e retorne a media das medias de todas as listas. Defina também uma funçãomediaJustaGlobal
que faça o mesmo, utilizandomediaJusta
7 Defina as assinaturas e implemente as funções abaixo, usando Pattern Matching:
isHead' a as
que retorna se o elementoa
é o primeiro da listaas
isSecond' a as
que retorna se o elementoa
é o segundo da listaas
isFirstEqualThird as
que retorna se o primeiro elemento é igual ao terceiro da lista. ExemploisFirstEqualThird [1,2,1,40] == True
- Gere as seguintes listas utilizando Compreensão de Listas:
- [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]
- [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23]
- Seu cliente do jogo de cartas online pediu para implementar, usando compreensão de listas, funções que gerem
- Um baralho completo
- A lista dos valores de todas as cartas do baralho
-
Faça uma função
Int -> [String]
que receba um valorn
de entrada e retorne uma lista com osn
primeiros elementos do desafio FizzBuzz -
Em um determinado sistema de uma e-commerce, desenvolvido em Haskell, um "produto" é uma tupla
(String, Float)
, em que o primeiro elemento é o nome do produto e o segundo é seu preço. Crie uma funçãosomarCarrinho
que, dado um carrinho de compras (i.e., uma lista de produtos[(String, Float)]
) retorne o valor total daquele carrinho.
-
Defina a função
quadradoMaisProximo n
que recebe um inteiron
e retorna, dentre os seus sucessores, o quadrado perfeito mais próximo (utilize a funçãoehQuadradoPerfeito
escrita por você!) -
Defina a função
fib n
que retorna on
-ésimo termo da sequência de fibonacci -
Defina as funções
maximo
eminimo
que recebam uma lista e retornem seus valores máximo e mínimo -
Dê o tipo e defina a função
ehElemento x xs
que retorna True casox
seja um elemento da listaxs
-
Defina a função
infiniteFib
que gere a lista infinita da sequência de fibonnaci. Reescreva a funçãofib
comofib' n
, usando as funçõestake
einfiniteFib
-
Utilizando sua função
ehElemento
, escreva a funçãoremoverDuplicados
, que remova os itens duplicados de uma lista
-
Refaça todos os exercícios da lista 06 - Compreensão de listas, mas utilizando funções de alta ordem como
map
efilter
-
Defina a função
findFirst f xs
que retorne o primeiro elemento dexs
que satisfaz o predicadof
-
Redefina as funções
maximo
,minimo
que recebam uma lista e retornem seus valores máximo e mínimo -
Defina as funções
map
efilter
em termos defold
s -
Redefina a função
somarCarrinho
para utilizar o operador de composição -
Reescreva as funções abaixo e explique o que elas fazem:
f x = negate (abs x)
f xs = negate (sum (tail xs))
f x = ceiling (negate (tan (cos (max 50 x))))
-
Crie os tipos
Produto
,Carrinho
,Cartas
eBaralho
, para correponder aos tipos que usamos durante os exercícios. -
Crie o tipo
Pred
que corresponde a um predicado aceito pela funçãofilter
efindFirst
(esta última definida por você) -
Altere a função
ehSaudavel
para receber uma única tupla como argumento, e crie o tipoSaude
para corresponder a essa nova tupla.
-
Defina os tipos
Moeda
eDinheiro
.Moeda
é um tipo soma que pode serReal
,Dolar
ouEuro
. Já o tipoDinheiro
é um tipo produto contendo umDouble
, representando o saldo disponível eMoeda
, representando qual moeda você possui. Crie também uma funçãocambio :: Dinheiro -> Moeda -> Dinheiro
que realize a conversao do valor recebido como parâmetro para a moeda escolhida. Utilize as cotações do dia. -
Dado o tipo
Tree
mostrado no curso, defina a instânciaFoldable Tree
. Para ver a mínima definição completa, utilize:info Foldable
. Sugestão: implementefoldr
em pre-ordem. -
Dados os tipos abaixo, implemente a função
eval :: Expr -> Bool
e defina uma instânciaShow Expr
data Op = And | Or
data Expr = Const Bool | Expr Bool Op Bool
-- Exemplos
show $ Expr (Const True) (And) (Expr (Const False) (Or) (Const True)) == "T && (F || T)"
show $ Expr (Const True) (Or) (Expr (Const False) (And) (Const True)) == "(T || F && T)"
eval $ Expr (Const True) (And) (Expr (Const False) (Or) (Const True)) == True
-
Dado o tipo
data Matriz a = Mat [[a]]
, defina a instanciaFunctor Matriz
-
Você está escrevendo uma lib que faz requisições HTTP para servidores. Você definiu o tipo
data Request a = Loading | Error | Success a
. Defina instâncias de Functor, Applicative e Monad para este tipo. -
Escreva uma função
cumprimenta :: String -> Int -> IO ()
que receba o nome e o ano de nascimento de uma pessoa e mostre a mensagem "Olá, Fulano! Você fará X anos em 2020!" -
Escreva uma função
voceEstaVelho :: Int -> IO ()
que receba o ano de nascimento de uma pessoa e apresenta um menu para a pessoa escolher dentre as opções:
- "1. Calcular idade atual": mostra a idade que essa pessoa fará em 2020 e retorna ao menu
- "2. Calcular outra idade": pede um ano inteiro X, mostra a idade que a pessoa fará em X e retorna ao menu
- "3. Sair": termina a execução da função