...collaborate on

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.

r1 - 23 Oct 2006 - 11:26:05 - JoseBacelarAlmeida
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM