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

alfredoas

Dúvida básica sobre funções com listas

5 mensagens neste tópico

Boas pessoal. Desde já obrigado por existirem.

Sou mesmo iniciante em Haskell e precisava de ajuda pra resolver este pequeno (penso eu) problema.

O meu problema é este. Dadas 3 listas de strings com tamanhos diferentes, concatenar a 1ª posição da 1ª lista com 1ª posição da 2ª lista com 1ª posição da 3ª lista e assim por diante. Algo como:

lista1::[string]
lista1 = ["1","1","1","1","1","1"]

lista2::[string]
lista2 = ["2","2","2","2","2"]

lista3::[string]
lista3 = ["3","3","3","3","3"]

concatena :: ([string],[string],[string]) -> String
concatena ([],[],[]) = []
concatena ((a:la),(b:lb),(c:lc)) = a ++ " " ++ b ++ " " ++ c ++ " - " ++ (concatena (la,lb,lc))

Só que quando invoco a função concatena (lista1,lista2,lista3) dá-me um erro do tipo: Exception: Non-exhastive patterns in function concatena.

Quando invoco a função concatena com o mesmo número de elementos nas listas, funciona como pretendido.

Alguém pode dar uma luz a este iniciante?  :-[

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso acontece porque uma das listas é mais pequena que as outras e vai aparecer uma situação em que uma das listas está vazia e as outras não e tu não tens nenhum padrão para apanhar esses casos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso acontece porque uma das listas é mais pequena que as outras e vai aparecer uma situação em que uma das listas está vazia e as outras não e tu não tens nenhum padrão para apanhar esses casos.

Caro Nazgulled,

Muito agradecido pela resposta. Eu sei que é devido a isso, e nesses casos eu queria que concatena-se apenas a(s) lista(s) que tivesse elementos.

Se eu fizer qualquer coisa do tipo:

concatena ([],[],[]) = []
concatena (_,[],[]) = []
concatena ([],_,[]) = []
concatena ([],[],_) = []

para condição de paragem, ele irá apenas listas o mesmo número de elementos das 3 listas e eu queria todos os elementos de cada lista.

Alguém poderia dar uma dica de como fazer isso?

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ao definires que sempre que aparece uma lista vazia, retornas uma lista vazia, ele apenas vai mostrar o mesmo número de elementos das 3 listas. Tens que indicar que, quando uma é vazia, ou quando duas são vazias, como se processa o cálculo. Vê assim:

concatena :: ([string],[string],[string]) -> String
concatena ([],[],[]) = []
concatena ([],[],l) = concat l
concatena ([],l,[]) = concat l
concatena (l,[],[]) = concat l
concatena (x:xs,y:ys,[]) = x ++ y ++ concatena (xs,ys,[])
concatena (x:xs,[],y:ys) = x ++ y ++ concatena (xs,[],ys)
concatena ([],x:xs,y:ys) = x ++ y ++ concatena ([],xs,ys)
concatena (x:xs,y:ys,z:zs) = x ++ y ++ z ++ concatena (xs,ys,zs)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Caro Baderous,

Funciona perfeitamente. Muito obrigado por me tirar esta dúvida.

Podem "trancar" o tópico, [Resolvido]

Abraços

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