nuno35 0 Posted January 2, 2019 Report Share Posted January 2, 2019 (edited) Boa Noite Estou aqui com dúvidas em dois exercícios. Um é encontrar um elemento numa lista para o qual o predicado seja verdadeiro tenho duas formas, mas não sei se estão corretas: -- 1ª Forma encontra predicado " " = Nothing encontra predicado (x:xs) |predicado x == True = x |otherwise encontra predicado xs -- 2º Forma encontra predicado lista = let lista = filter predicado lista lista!!0 na segunda forma não sei como posso devolver a posição 0 O segundo exercício é dividir uma string numa lista de string de tamanho k Exemplo: > Fatias 3 "olalisboa" ["ola","lis","boa"] Se não for uma divisão certa a última string pode ter mais um ou menos 1 elementos Alguém me pode dar uma ajuda nestes exercícios? desde já Obrigado Edited January 26, 2019 by pwseo Correcção do título, formatação, alguns erros... Link to post Share on other sites
thoga31 577 Posted January 10, 2019 Report Share Posted January 10, 2019 (edited) Não entendi o primeiro exercício do predicado. Quanto ao segundo: fatias _ [] = [] fatias n xs = take n xs : fatias n (drop n xs) Cumprimentos. Edited January 10, 2019 by thoga31 Knowledge is free! Link to post Share on other sites
pwseo 234 Posted January 26, 2019 Report Share Posted January 26, 2019 @nuno35, Tomei a liberdade de editar o título deste tópico (tens dado títulos muito gerais e pouco descritivos) e de corrigir alguns pomenores de linguagem no teu post de abertura. Passemos às tuas dúvidas. No caso da função encontra, considero inválida a 2ª forma que forneceste, porque não é recursiva; simplesmente recorres à função filter que faz toda a recursividade por ti, e penso que não era esse o objectivo. Posto isto, qual é a assinatura da função encontra? É suposto aplicar-se apenas a Strings? Vamos por partes. Isto é o que tu pretendes com a função encontra: Citação encontrar um elemento numa lista para o qual o predicado seja verdadeiro Podemos, portanto, assumir que encontra deve aceitar como parâmetros um predicado (ie. uma função que aceita um valor de um determinado tipo de dados t e devolve um Bool) e uma lista ([t]). Como existe a possibilidade de não haver nenhum elemento que cumpra o predicado, temos que poder devolver um valor Nothing, pelo que podemos assumir que a assinatura será algo assim: -- o predicado -- | a lista -- vvvvvvvvv vvv encontra :: (t -> Bool) -> [t] -> Maybe t Vou definir o caso base por ti, e deixo o caso geral (recursivo) para definires: encontra :: (t -> Bool) -> [t] -> Maybe t -- seja qual for o predicado, se a lista for vazia, devolver Nothing encontra _ [] = Nothing -- Caso geral: para completares encontra pred (x:xs) | pred x = ... | otherwise = ... -- Nota: `pred x` e `pred x == True` são a mesma coisa Se completares os espaços acima, terás uma função que não quer saber que tipo de dados estás a utilizar, e que te devolve um valor do tipo t envolvido num Maybe (Just t ou Nothing). Quanto ao segundo exercício o @thoga31 já se pronunciou. Vai falando das tuas dúvidas Link to post Share on other sites
nuno35 0 Posted January 26, 2019 Author Report Share Posted January 26, 2019 já consegui fazer esta função fiz muito parecido a tua solução. encontra predicado [] = Nothing encontra predicado (x:xs) |predicado x == True = x |otherwise = encontra predicado xs So nao percebi o porque de teres posto "-- Caso geral: para completares" falta algum caso geral? Achas que a função transposta pode ser colocada aqui ou criar um tópico novo? Link to post Share on other sites
pwseo 234 Posted January 26, 2019 Report Share Posted January 26, 2019 36 minutos atrás, nuno35 disse: já consegui fazer esta função fiz muito parecido a tua solução. ... So nao percebi o porque de teres posto "-- Caso geral: para completares" falta algum caso geral? O «-- Caso geral: (...)» dizia respeito às linhas seguintes, que tu completaste, e muito bem Tenho apenas um reparo a fazer: predicado x == True é redundante, e podes substituir por predicado x apenas (é a mesma coisa). Link to post Share on other sites
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