CloudPT Posted October 20, 2012 at 05:44 PM Report #479873 Posted October 20, 2012 at 05:44 PM Boas, Decidi começar a programar em haskell e compre um livro e estou a tentar resolver alguns exercícios sobre dados duplicados. Estou com dificuldade em responder a uma questão que diz: Defina uma função que devolve True caso os dados da lista sejam repetidos ex lista [1,2,2] ou False caso os dados não sejam repetidos ex: lista [1,2,3]. Cumprimentos,
Baderous Posted October 20, 2012 at 10:56 PM Report #479895 Posted October 20, 2012 at 10:56 PM Faz 1 função que receba um dado valor e verifique se ele existe numa lista. De seguida é só criar outra função onde aplicas essa função para cada elemento da lista dada como argumento.
CloudPT Posted October 21, 2012 at 10:22 AM Author Report #479909 Posted October 21, 2012 at 10:22 AM Obrigado por ter respondido à mensagem eu acho que já consegui fazer com que a função receba um dado valor: duplicado :: (Eq a) => [a] -> [a] duplicado [] = [] Não estou a conseguir criar outra função para cada elemento da lista dada 😞 . Terei de fazer algo do genero ? duplicado (x:xs) = x : duplicado (\y -> not (x == y) xs) Mas, assim estou a devolver uma lista não estou a retornar True ou False. Cumprimentos
mundo Posted October 21, 2012 at 12:13 PM Report #479915 Posted October 21, 2012 at 12:13 PM O cabeçalho da tua função será algo tipo repetido :: [a] -> Bool
mundo Posted October 21, 2012 at 12:40 PM Report #479916 Posted October 21, 2012 at 12:40 PM Pronto, vou postar o código para tipo generico, se quiseres especificamente para Int, no cabeçalho da funçao nao precisa do (Eq a) => existe :: (Eq a) => a -> [a] -> Bool existe a [] = False existe a (x:xs) = if a == x then True else existe a xs repetidos :: (Eq a) => [a] -> Bool repetidos [] = False repetidos (x:xs) = if existe x xs then True else repetidos xs 1 Report
CloudPT Posted October 21, 2012 at 02:29 PM Author Report #479924 Posted October 21, 2012 at 02:29 PM Obrigado mais uma vez pela ajuda. Quero ver se percebo o teu código por isso vou fazer um genero de debug 🙂 . terminal repetidos [1,2,3,2] -> true 1º começamos no repetidos que recebe um elemento 2º se a lista for vazia retorna falso. 3º no existe recebemos o 1º elemento da lista (não interessa se é inteiro ou char etc...) 4º se for lista vazia então retorna falso. 5º se o 1º elemento (a) for igual ao 2º elemento (x) então true (acho que o programa compara o 1º elemento com o da lista toda) caso contrario muda o 'a' para o segundo elemento e compara novamente com a lista toda etc.... Cumprimentos,
mundo Posted October 21, 2012 at 02:56 PM Report #479928 Posted October 21, 2012 at 02:56 PM Sim, faz a comparação de forma recursiva 1 Report
CloudPT Posted October 21, 2012 at 03:35 PM Author Report #479931 Posted October 21, 2012 at 03:35 PM Eu agora queria fazer um programa para repetir os numero da lista ex: repetir [1,3,5] resultado -> [1,3,3,3,5,5,5,5,5] tive a pesquisar e verifiquei que tenho de utilizar um take e um repeat só para inteiros. existe xs = take y (repeat x) Só que não me está a dar correcto alguma ideia ?
Baderous Posted October 21, 2012 at 05:39 PM Report #479933 Posted October 21, 2012 at 05:39 PM Usa a função replicate.
CloudPT Posted October 21, 2012 at 06:03 PM Author Report #479936 Posted October 21, 2012 at 06:03 PM boa ideia consegui isto myReplicate :: Int -> a -> [a] myReplicate n x | n <= 0 = [] | otherwise = x : replicate (n-1) x só falta dar uma lista ou seja, eu meto myReplicate [1,2,3] resultado -> [1,2,2,3,3,3] Alguma ideia ?
mundo Posted October 21, 2012 at 06:27 PM Report #479938 Posted October 21, 2012 at 06:27 PM (edited) Repara no que tens: myReplicate :: Int -> a -> [a] estás a dizer, estou a espera de um inteiro, e um outro tipo de dado qualquer, e vou devolver uma lista, será que é mesmo assim que queres? Edited October 21, 2012 at 06:27 PM by mundo
CloudPT Posted October 21, 2012 at 06:45 PM Author Report #479939 Posted October 21, 2012 at 06:45 PM sim quero inteiros só. Acho tem de ser assim: myReplicate :: [int] -> [int] eu dou uma lista [2,3,5] depois devolve uma lista [2,2,3,3,3,5,5,5,5,5]
CloudPT Posted October 21, 2012 at 07:38 PM Author Report #479942 Posted October 21, 2012 at 07:38 PM Ora ai está replicar :: [int] -> [int] replicar xs = [x | x <- xs, _ <- [1..x]]
mundo Posted October 21, 2012 at 10:13 PM Report #479964 Posted October 21, 2012 at 10:13 PM sim quero inteiros só. Acho tem de ser assim: myReplicate :: [int] -> [int] eu dou uma lista [2,3,5] depois devolve uma lista [2,2,3,3,3,5,5,5,5,5] Não se tratava de devolver Inteiro, até podias devolver batatas lol, O acontecia é que dizias que querias uma lista, e nao estavas a dizer que o argumento era uma lista, mas sim um tipo genérico
CloudPT Posted October 21, 2012 at 11:55 PM Author Report #479970 Posted October 21, 2012 at 11:55 PM exacto faltava esse pequeno/grande pormenor lol. Obrigado 🙂
mundo Posted October 22, 2012 at 08:24 AM Report #479986 Posted October 22, 2012 at 08:24 AM Não sou moderador do forum nem nada do genero, mas carrega na opção a dizer que o tópico está resolvido, se já nao tens questões, e caso venhas a ter dúvidas de novas funções cria um novo tópico, pois depois facilita na procura de tópicos
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now