Sessão Laboratorial 4
Este Guião é a continuação do da
sessão anterior.
Assuntos abordados nesta sessão:
Funções de ordem superior simples
Nas funções realizadas na última tarefa da
sessão anterior é bem patente que algumas delas partilham um mesmo padrão: um exemplo será o cálculo das listas dos alunos aprovados e reprovados - em ambos os casos "filtramos" da lista original os elementos que satisfazem um dado critério. O facto de o
Haskell permitir manipular funções como quaisqueres outros valores (e.g. podemos passar funções como argumentos para outras funções) permite-nos criar funções que abstraiam esses padrões comuns. Continuando com o exemplo da lista de aprovados/reprovados, podemos utilizar função pré-definida
filter :: (a->Bool) -> [a] -> [a]
que filtra todos os elementos de uma lista que satisfassam um dado predicado. As funções ficariam então:
alunosAprov :: Curso -> [Aluno]
alunosAprov xs = filter (verifAprov) xs
alunosReprov :: Curso -> [Aluno]
alunosReprov xs = filter (not . verifAprov) xs
Obs.:
(not . verifAprov)
é a composição de ambas as funções:
not
após
verifAprov
.
Outras funções pré-definidas no
Prelude
que correspondem a padrões repediamente encontrados são:
- map::(a->b)->[a]->[b], (map f l) aplica a função f a cada elemento de l retornando a lista de resultados. Exemplo:
map verifAprov listaAlunos
retorna [True, False, True]
.
- zip::[a]->[b]->[(a,b)], (zip l1 l2) associa os elementos das listas
l1
e l2
produzindo uma lista de pares. Exemplo: (zip [1,2,3] ['A','B','C'])
retorna [(1,'A'),(2,'B'),(3,'C')]
.
- unzip::[(a,b)]->([a],[b]), (unzip l) separa uma lista de pares duas listas, cada uma contendo cada uma das componentes. Exemplo:
(unzip [(1,'A'),(2,'B'),(3,'C')])
retorna ([1,2,3],['A','B','C'])
- ...
Tarefa 1: Pode fazer uso de alguma(s) destas funções nas funcionalidades pedidas na sessão anterior? Experimente...
Utilização das bibliotecas
Já se referiu que a
biblioteca do
Haskell dispõe de um vasto conjunto de funções úteis (algumas já tem vindo a ser referidas, muitas outras o serão ao longo do semestre...). A forma última de se conhecer a oferta existente, e de obter informação para a sua utilização consiste em consultar a
documentação existente. Para a tarefa que se segue pretende-se utilizar algumas funções dos seguintes módulos (para além das já referidas...):
Tarefa 2: Pretende-se realizar um programa que realize um histograma com a frequência das palavras que ocorrem nesse texto. Assim, o resultado de avaliar
hist "Um texto com palavras... um, com, palavras, palavras, dois,dois"
deverá retornar a lista:
[("um",2),("texto",1),("com",2),("palavras",3),("dois",2)]
Note que se ignora a pontuação e não se distinguem as letras maiúsculas das minúsculas.