Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ASHASHIN

pattern match failure

Mensagens Recomendadas

ASHASHIN

Boas, eu estava a tentar escrever uma função que multiplicase o 1º elemento de uma lista com o segundo e soma-se com a multiplicação do 5º e do sexto e por aí fora "Ex: x1*x2+x5*x6+x9*x10".

O que eu já fiz até agora foi:

f :: [int] -> Int

f [] = 0

f (x1:x2:x3:x4:xs) = x1*x2 + f (xs)

mas quando tento por exemplo fazer por exemplo : f  [1,2,3,4,5,6,7,8,9,0] aparece o seguint erro "Program error: pattern match failure: f  [9,0]", provavelmete o que falta é acrescentar qualquer coisita mas não estou a conseguir descobrir o quê.  :wallbash:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Porque a definição da tua função está dependente da existência de 2 elementos (os 2 primeiros) em qualquer lista em que é invocada (isto é, à medida que fazes invocações recursivas sobre a lista, a lista em questão deve ter no mínimo 2 elementos, que são o x1 e o x2). Se não tiver esses 2 elementos, o interpretador não sabe o que fazer com uma lista com apenas 1 elemento. Por isso tens de acrescentar esse caso na definição:

f :: [int] -> Int
f [] = 0
f [x] = ...
f (x1:x2:xs) = x1*x2 + f (xs)

Edit: Não precisas de ter o x3 e x4 porque não os usas, era esse o outro problema, estavas a indicar o que a função deveria fazer quando tivesse pelo menos 4 elementos, e depois faltavam os outros casos (com 2 e 3). Assim já está a dar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ASHASHIN

mas se eu não adicionar o x3 e o x4 ele vai adicionar tambem o x3*x4 e o x7*x8 ( e eu não quero isso), esqueci-me de dizer que o comprimento é sempre >= 4, em relação a ficar um elemento sózinho tambem vai ser impossivel ( eu devia ter dito isto no primeiro post) porque a lista tem que ter comprimento par

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Precisas de definir a função para os seguintes casos, ou garantir que esses casos nunca acontecem:

f [] = 0
f [x1] = ...
f [x1,x2] = ...
f [x1,x2,x3] = ...
f (x1:x2:x3:x4:xs) = x1*x2 + f (xs)

Admitindo que a lista tem sempre comprimento par, só precisas de definir o caso do meio (f [x1,x2]).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ASHASHIN

@Rui Carlos: Obrigado, já tinha pensado nisso também mas em vez de escrever "[x1,x2,x3]" tava a fazer "[x1:x2:x3]", problema resolvido, Obrigado aos dois ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

@Rui Carlos: Obrigado, já tinha pensado nisso também mas em vez de escrever "[x1,x2,x3]" tava a fazer "[x1:x2:x3]", problema resolvido, Obrigado aos dois ;)

Já agora, sabes porque é que o que estavas a fazer ([x1:x2:x3]) está errado?

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.