Moises 0 Posted August 6, 2020 Report Share Posted August 6, 2020 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 post Share on other sites
Baderous 31 Posted September 3, 2020 Report Share Posted September 3, 2020 (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 by Baderous Indentação 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