Exercícios Práticos: Programação funcional com Haskell
Preparação
Para este exercício você vai precisar do GHC (Glasgow Haskell Compiler), que é composto por um compilador e um interpretador para Haskell. Ele está disponível para várias plataformas em http://hackage.haskell.org/platform/. O exemplo abaixo mostra como invocar o interpretador do GHC no Linux:
user@host:~$ ghci GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude>
Comandos básicos do GHCi
- :load ou :l: carrega um programa
- :quit ou :q ou Ctrl-D: sai do interpretador
Exercícios básicos
- (Funções simples) Qual será o resultado de cada função abaixo? Verifique sua resposta usando o interpretador.
min 16 8 max 100 101 succ 10 succ 5 * 4 succ (5 * 4) "abra" ++ "cadabra"
- (Funções com listas) Qual será o resultado de cada função abaixo? Verifique sua resposta usando o interpretador.
["abacaxi", "laranja", "uva"] !! 0 ["abacaxi", "laranja", "uva"] !! 1 ["abacaxi", "laranja", "uva"] !! 2 ["abacaxi", "laranja", "uva"] !! 3
- (Funções com listas) Qual será o resultado de cada função abaixo? Verifique sua resposta usando o interpretador. Veja aqui uma explicação ilustrada destas funções :-)
head [1,2,3,4,5] tail [1,2,3,4,5] last [1,2,3,4,5] init [1,2,3,4,5]
- (Funções com listas) Qual será o resultado de cada função abaixo? Verifique sua resposta usando o interpretador.
head [] null [1,2,3] null [] take 3 [1,2,3,4,5] take 1 [3,6,9] take 5 [1,2] take 5 ['a'..'z'] take 0 [1,2,3] drop 3 [1,2,3,4,5] drop 3 ['A'..'Z'] drop 0 [1,2,3,4,5] drop 100 [1,2,3,4,5] length [1,0,0,1,0] maximum [4,7,1,9,4,0] minimum [4,7,1,9,4,0] length "abracadabra" elem 4 [1,2,3,4] elem 5 [1,2,3,4] 4 `elem` [1,2,3,4]
Programando em Haskell
- Baixe o programa first.hs. Abra-o em um editor e observe seu código.
- Carregue este programa no interpretador:
Prelude> :l first.hs
- Teste as funções do programa, observando alguns erros que podem ocorrer:
quadrado 5 quadrado 5.0 quadrado 5. addThreeInt 5 6 1 addThreeInt 5 6 addThreeInt 1 2.0 3 addThreeFloat 1 2 3 addThreeFloat 1 2.1 3 superSizeMe 10
- Inclua uma função
par :: Int -> Bool
em first.hs, para verificar se um número inteiro é par ou ímpar. Use a funçãomod
, que retorna o resto de uma divisão inteira (ex.:mod 5 2
retorna1
). Para testar a função você deve carregar novamente o arquivo first.hs. - Inclua uma função somaLista em first.hs, para calcular o somatório de elementos de uma lista. Essa função encontra-se parcialmente definida abaixo. Você deve completar a parte marcada com "...". Use recursividade e lembre-se das funções
head
etail
.somaElem :: [Int] -> Int somaElem [] = 0 somaElem lis = ...
- Observe a função addThree, que usa o conceito de typeclass (classe de tipo) em Haskell para funcionar com qualquer tipo numérico. Veja mais sobre typeclasses em: http://learnyouahaskell.com/types-and-typeclasses#typeclasses-101.
- A função superSizeMe em first.hs não tem tipo especificado. Altere o arquivo first.hs para incluir uma definição de tipo nesta função. Use o conceito de typeclass para que a função se aplique a qualquer tipo numérico.