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

Isabel Macedo

Duvida numa Ficha de Trabalho

4 mensagens neste tópico

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora