Moises Posted August 6, 2020 at 07:15 PM Report Share #618995 Posted August 6, 2020 at 07:15 PM Defina a função filtraAplicaFold :: (a->b) -> (a->Bool)->[a]-> tal que (filtraAplicaFold f p xs) é uma lista obtida aplicando a função f aos elementos de xs que satisfazem o predicado p usando a função foldr. Por exemplo, filtraAplicaFold (4+) (<3) [1..7] == [5,6] Codigo testado, mas que esta dando problema: filtraAplicaFold :: (a->b) -> (a->Bool)->[a]-> filtraAplicaFold [] [] = True filtraAplicaFold _ [] = False filtraAplicaFold [] _ = False filtraAplicaFold (f:fs) ((a,b):vals) = (f a b) && (filtraAplicaFold fs vals) Moises Link to comment Share on other sites More sharing options...
Baderous Posted September 3, 2020 at 09:50 PM Report Share #619270 Posted September 3, 2020 at 09:50 PM (edited) O tipo (a->b) não representa uma lista mas sim uma função que dado um elemento do tipo a devolve um elemento do tipo b. O mesmo se aplica ao tipo (a->Bool). Por isso as tuas definições não estão coerentes porque estás a fazer pattern-matching com listas (lista vazia [], f:fs, etc). Se tens de usar a função foldr então tens de fazer algo parecido ao que colocaste neste teu outro tópico. filtraAplicaFold :: (a->b) -> (a->Bool) -> [a] -> [b] filtraAplicaFold f p l = foldr (\x r -> if p x then (f x):r else r) [] l Sendo x um elemento da lista inicial l, se x verifica o predicado p então aplica-se-lhe a função f, e repete-se o procedimento para o resto da lista r. Caso contrário, ignora-se o x e o procedimento segue para r. Assume-se que a lista final inicialmente começa vazia ([]) e os resultados intermédios vão-lhe sendo adicionados via foldr. Se o problema for perceber o funcionamento do foldr basta fazeres uma pesquisa aqui no fórum, essa função já foi explicada várias vezes. Edited September 3, 2020 at 09:52 PM by Baderous Indentação Link to comment Share on other sites More sharing options...
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