Jump to content

Duvida foldr


FSaraiva
 Share

Recommended Posts

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á

Link to comment
Share on other 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.

Link to comment
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
 Share

×
×
  • Create New...

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.