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

ASHASHIN

pattern match failure

Recommended Posts

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:

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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]).

Share this post


Link to post
Share on other 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 ;)

Share this post


Link to post
Share on other 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?

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.