Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Isabel Macedo

Duvida numa Ficha de Trabalho

Recommended Posts

Isabel Macedo

http://www.di.uminho.pt/~jas/Teaching/Courses/pf/08-09/Ficha3.pdf

Tenho uma duvida na Tarefa 8 na perugunta 2)

Consegui definir a função sem funçoes de ordem superior

semRepet []=False
semRepet (((e3,g3),(e4,g4)):xs) = semRepetAux ((e3,g3),(e4,g4)) xs || semRepet xs

semRepetAux :: Jogo->Jornada->Bool
semRepetAux _ [] = False
semRepetAux ((e1,g1),(e2,g2)) (((e3,g3),(e4,g4)):xs) | e1==e3||e1==e4||semRepetAux ((e1,g1),(e2,g2)) xs = True
                                                     | e2==e3||e2==e4||semRepetAux ((e1,g1),(e2,g2)) xs=True
                                                     | otherwise=False

mas agora nao sei defini-la usando funçoes de ordem superior. Tentei usar o foldr da seguinte maneira:

filtraRepetidos (x:xs) = foldr (\((e,g),(e1,g1))ac->semRepetAux x xs || ac ) False l
     where l=(x:xs)
     

mas nao dá o resultado pretendido. Será k tenho de usar outra função de ordem superior? Obrigado...

Share this post


Link to post
Share on other sites
Rui Carlos

Uma forma simples de aplicar funções de ordem superior será usando um map para aplicar a função auxiliar, obtendo um lista de booleanos, que depois verificarias se eram todos iguais a False.

Também podes usar o filter na função auxiliar. Filtravas aqueles em que uma das equipas de um jogo se repetia, e depois vias se a lista era vazia.

Quanto à tua função, aqui:

\((e,g),(e1,g1))ac->semRepetAux x xs || ac 

está sempre a usar os valores x e xs, ou seja, estás apenas a ver se uma das equipas do jogo x se repete. Para o resto das equipa dos xs não fazes essa verificação.

O que devias ter era isto:

filtraRepetidos jornada = foldr (\jogo ac -> semRepetAux jogo jornada || ac ) False l

EDIT: Atenção que estás sempre a usar a lista original, por isso, os jogos vão sempre se repetir uma vez, a menos que removas antes esse jogo da lista de jogos.

Share this post


Link to post
Share on other sites
Isabel Macedo

A função

semrepeticoes jornada = foldr (\jogo ac ->semRepetAux jogo jornada || ac ) False l
       where l = jornada

nao me dá o valor pretendido. Se eu colocar uma lista com equipas diferentes dá-me valor True, e devia-me dar valor False. Não entendo qual é o erro...

Também não sei como testar uma função foldr á mão. Agradecia k me ajudassem a entender como se testa á mão.... :down:

Obrigado

Share this post


Link to post
Share on other sites
Rui Carlos

Lê o meu EDIT no post anterior. Vais sempre encontrar um jogo com aquela equipa na lista de jogos (tu foste buscar a equipa a essa lista, por isso ela tem que lá aparecer).

Ou seja, ou alteras a tua função semRepetAux, de modo a que ela só devolva True se encontrar a equipa duas vezes, ou antes de chamar a função semRepetAux, removes o jogo da lista.

Neste último caso, ficarias com

foldr (\jogo ac ->semRepetAux jogo (delete jogo jornada) || ac ) False l

A função delete está definida no módulo List.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.