-
Nestes exercícios, vamos usar algumas facilidades sintáticas do Haskell para gerar listas, isto é, vamos criá-las programaticamente e não só processá-las, como em exercícios anteriores. Essas facilidades estão explicadas nestes slides slides. Um importante recurso que usaremos é o conceito de list comprehension, que é um grande facilitador em Haskell e está presente em muitas outras linguagens.
-
Os exercícios não são para entregar, não se preocupe com nota agora. Use o Discord da disciplina para postar dúvidas e soluções, converse com colegas, "brinque" com a linguagem, use o interpretador interativo para testar funções rapidamente. Procure pensar diferente do que costuma fazer em linguagens imperativas. Quebre cada função em outras funções, reuse as que você já conhece, procure outras.
-
Usando list comprehension, defina uma função
add10toall :: [Int] -> [Int]
, que receba uma lista e adicione o valor 10 a cada elemento dessa lista, produzindo outra lista. Exemplo:> add10toall [0,1,2] [10,11,12]
-
Usando list comprehension, defina uma função
multN :: Int -> [Int] -> [Int]
, que receba um númeroN
e uma lista, e multiplique cada elemento da lista porN
, produzindo outra lista. -
Usando list comprehension, defina uma função
applyExpr :: [Int] -> [Int]
, que receba uma lista e calcule3*x+2
para cada elementox
da lista, produzindo outra lista. -
Usando list comprehension, escreva uma função
addSuffix :: String -> [String] -> [String]
, para adicionar um dado sufixo às strings contidas numa lista. Exemplo:> addSuffix "@inf.ufsm.br" ["fulano","beltrano"] ["fulano@inf.ufsm.br","beltrano@inf.ufsm.br]
-
Usando list comprehension, defina uma função
selectgt5 :: [Int] -> [Int]
, que receba uma lista e selecione somente os valores maiores que 5, produzindo outra lista. -
Usando list comprehension, defina uma função
sumOdds :: [Int] -> Int
, que receba uma lista e obtenha o somatório dos valores ímpares, produzindo outra lista. Pesquise funções auxiliares que manipulem listas. -
Usando list comprehension, defina uma função
selectExpr :: [Int] -> [Int]
, que receba uma lista e selecione somente os valores pares entre 20 e 50, produzindo outra lista. -
Escreva uma função
countShorts :: [String] -> Int
, que receba uma lista de palavras e retorne a quantidade de palavras dessa lista que possuem menos de 5 caracteres. Use list comprehension. -
Escreva uma função
calcExpr :: [Float] -> [Float]
, que calculex^2/2
para cada elementox
da lista de entrada e selecione apenas os resultados que forem maiores que 10. Use list comprehension. -
Escreva uma função
trSpaces :: String -> String
, que receba uma string e converta espaços (' ') em traços ('-'). Use list comprehension. -
Qual será o resultado de cada expressão abaixo?
- a)
[ (x,y) | x <- [1..5], even x, y <- [(x + 1)..6], odd y ]
- b)
[ a ++ b | a <- ["lazy","big"], b <- ["frog", "dog"]]
- c)
concat [ [a,'-'] | a <- "paralelepipedo", not (elem a "aeiou")]
- a)
-
Defina uma função
selectSnd :: [(Int,Int)] -> [Int]
, que receba uma lista de tuplas e selecione somente os segundos elementos dessas tuplas, produzindo outra lista. Use list comprehension. -
Em Haskell, a função
zip
combina elementos de duas listas, produzindo uma lista de tuplas. Por exemplo:> zip [1,2] "ab" [(1,'a'),(2,'b')] > zip [1..] "abcde" [(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]
Usando a função
zip
com list comprehension e outras funções auxiliares, escreva uma funçãodotProd :: [Int] -> [Int] -> Int
que calcule o somatório dos produtos dos pares de elementos de duas listas, conforme o exemplo:> dotProd [1,1,1,1] [2,2,2,2] -- 1*2 + 1*2 + 1*2 + 1*2 8
-
Nesta questão você também deverá usar list comprehension. Suponha que um retângulo seja representado por uma tupla
(Float,Float,Float,Float)
, contendo respectivamente as coordenadas x e y do ponto no seu canto superior esquerdo, seguidas das suas medidas de largura e altura. Sabendo que o eixo x cresce de cima para baixo e o eixo y da esquerda para direita, crie uma funçãogenRects :: Int -> (Int,Int) -> [(Float,Float,Float,Float)]
que receba um número N e um ponto (x,y) e gere uma sequência de N retângulos não sobrepostos. Os retângulos devem ser alinhados pelos seus topos, a partir do ponto dado, com largura e altura constantes. Por exemplo, usando largura e altura iguais a 5.5:> genRects 3 (0,0) [(0.0,0.0,5.5,5.5),(5.5,0.0,5.5,5.5),(11.0,0.0,5.5,5.5)]
Obs.: Use conversão explícita de tipos quando misturar Int e Float.