Ir para o conteúdo
luchhozito

sufixo

Mensagens Recomendadas

luchhozito    0
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:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
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!

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade