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

luchhozito

sufixo

Recommended Posts

luchhozito

boas pessoal,

tenho um problema que é o seguinte:

quero fazer uma funcao que dado um [a] -> [a] -> Bool, exemplo "comodo" "incomodo" = True

tenho isto:

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] [] = False
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False

agora a parte do true , estou a pensar, mas queria uma opiniao se souberem :confused:

Share this post


Link to post
Share on other sites
Rui Carlos

Seja n a diferença de comprimentos das duas listas. Só precisa de verificar se a primeira é igual à segunda, depois de teres deitado fora os primeiros n elementos da segunda lista.

PS:

sufixo [] [] = False
sufixo [] a = False

Alguma razão em especial para devolveres falso nestes casos?

PS2: Não precisas de testar o caso em que ambas as listas são vazias, pois este é apenas um caso particular dos dois seguintes.

Share this post


Link to post
Share on other sites
luchhozito

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False
           | (drop (aux x y )y) = x 

aux :: [a] -> [a] -> Int		   
aux x y = length y - length x 

fiz isto , mas acho que n ta la mt bem :P

Share this post


Link to post
Share on other sites
Baderous

Eu consideraria a string vazia como sendo sufixo de qualquer string. No entanto podes resolver isso assim:

sufixo a b = (drop $ (length b - length a)) b == a

Share this post


Link to post
Share on other sites
luchhozito

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False
           | ((drop $ (length y - length x)) y == x) = True

ja funciona :P thanks Baderous

Share this post


Link to post
Share on other sites
Baderous

Não precisas de escrever isso tudo. Aquela linha que eu escrevi basta (considerando a string vazia como sufixo de qualquer string).

Share this post


Link to post
Share on other sites
necrodust

reparei numa coisa, com

sufixo a b = (drop $ (length b - length a)) b == a

se testares com duas palavas iguais, por exemplo: sufixo "comodo" "comodo" , ele devolve True... eu fiz a função de outra forma mas estou a ter o mesmo problema...

Share this post


Link to post
Share on other sites
luchhozito

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | ((drop $ (length b - length a)) b == a) = True

assim ja resolve o problema penso eu.

Share this post


Link to post
Share on other sites
necrodust

acrescentei masi uma linha de codigo

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | ((drop $ (length b - length a)) b == a) = True
           | ((drop $ (length b - length a)) b /= a) = False

senão se fizesses por exemplo: sufixo "comodo" "batata" dava erro

Share this post


Link to post
Share on other sites
Rui Carlos

Não é necessária outra linha.

O que estão a fazer é, se x for verdadeiro, devolve verdadeiro, e se x for falso devolve falso. Quando isto acontece, podem devolver logo o x.

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | otherwise = (drop $ (length b - length a)) b == a

Share this post


Link to post
Share on other sites
necrodust

lol o meu exemplo estava errado... ha casos em que vai devolver erro, experimenta fazer :

sufixo "completo" "completissimo"

penso que da erro quando a segunda lista é maior que a pimeira, "Non-exaustive patterns..."

com a linha de codigo que acrescentei acho que isso ja nao acontece...

Share this post


Link to post
Share on other sites
necrodust

Não é necessária outra linha.

O que estão a fazer é, se x for verdadeiro, devolve verdadeiro, e se x for falso devolve falso. Quando isto acontece, podem devolver logo o x.

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | otherwise = (drop $ (length b - length a)) b == a

esquece o que eu disse, eu estava-me a referir ao codigo anterior... como tens aí funciona perfeitamente!

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.