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

FSaraiva

Duvida foldr

4 mensagens neste tópico

Boa Tarde.

Sei que sou reincidente neste fórum e nao pensem que nao ando a ver se entendo esta linguagem mas é que cada vez está mais complicado e para voçes deve ser canja...

Por isso ajudem-me please.

O problema é o seguinte: :wallbash:

Definir a função searchList :: (α -> Bool) -> [α] -> Maybe [α] que devolve os

elementos da lista dada que satisfaçam o predicado dado (através do construtor Just),

ou Nothing no caso contrário.

mas o problema é que eu consigo fazer recursivamente e só para um elemento e queria que apresenta-se uma lista dos elementos que satisfazem o predicado

search :: (a -> Bool) -> [a] -> Maybe a
search p = foldr (\x xs -> if p x then Just x else xs) Nothing

Exemplo do resultado esperado que me retorna recursivamente mas nao é o objectivo

Main> searchList (>0) [-10..10]

Just [1,2,3,4,5,6,7,8,9,10]

Main> searchList (>0) [-10..0]

Nothing

Obrigado desde já

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi nada do post... O teu texto está um bocado confuso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aquele código que eu coloquei só me apresenta Just [o primeiro elemento que satizfaz a condiçao do predicado] mas eu preciso de uma maneira que apresenta Just [todos os elementos da lista que satisfaçam o predicado] ou Nothing caso nenhum elemento da lista satisfaça a condiçao.,..

Espero ter sido explicito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na função \x xs -> if p x then Just x else xs, quando p x se verifica, estás apenas a devolver o x, em vez de adicionar o x ao resultado já calculado (o xs).

O tipo de dados da função que definiste está errado. Devia ser Maybe [a] e não Maybe a.

Também não percebi muito bem a ideia de usar o Maybe. Se nenhum elemento verificasse a condição, devolvias a lista vazia. O facto de usares o Maybe vai complicar o problema.

Tens duas alternativas, e crias uma função que apenas calcule a lista dos elementos que verificam a condição (basicamente, implementas o filter), e no final vês se a lista é ou não vazia, e em função disso devolves Nothing ou Just ..., ou então, se quiseres usar aquele Nothing que tens para o caso de paragem (em vez de uma lista vazia), em vez de apenas adicionar o x à lista xs, vais ter que verificar se o xs é Nothing ou um Just ... para decidires o que fazer.

0

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