Jump to content

[Haskell] Passar função como argumento de outra função


Recommended Posts

Posted

Num determinado trabalho tenho as seguintes funções:

-------------- Função 1 --------------

replaceCharsMulti :: [string] -> [string] -> String -> String

replaceCharsMulti _ _ [] = []

replaceCharsMulti [] bak m = replaceCharsMulti bak bak m

replaceCharsMulti (x:xs) bak (y:ys) = [getNewChar abcList x y] ++ (replaceCharsMulti xs bak ys)

-------------- Função 2 --------------

replaceCharsMultiRev :: [string] -> [string] -> String -> String

replaceCharsMultiRev _ _ [] = []

replaceCharsMultiRev [] bak m = replaceCharsMultiRev bak bak m

replaceCharsMultiRev (x:xs) bak (y:ys) = [getNewChar x abcList y] ++ (replaceCharsMultiRev xs bak ys)

Como podem ver, a única diferença entre elas é a troca de argumentos quando se invoca a função getNewChar. O que eu quero fazer é, juntar estas duas funções numa só, usando algum tipo de parametro para invocar a função getNewChar da forma que pretendo pa determinada situação. Como faço isso? Nunca percebi muito bem o map, mas é possível fazer isto com o map certo? Se possível, deixem as alternativas de fazer isto, com e sem map (se é que é possível com o map e/ou de outra forma).

Posted

As funções replaceCharsMulti e replaceCharsMultiRev recebe 2 listas de strings, uma string e devolve uma string como dá para ver pela assinatura da função. Ambas as listas de strings são exactamente iguais (recebem o mesmo conteudo, uma delas serve de backup para quando chegar ao fim da primeira lista, restaurar essa primeira lista com o backup). O conteudo dessas listas são varios alfabetos com letras trocadas, por exemplo: ["CDEFGHIJKLMNOPQRSTUVWXYZAB", "KLMNOPQRSTUVWXYZABCDEFGHIJ", "STUVWXYZABCDEFGHIJKLMNOPQR"]. E outra string é uma mensagem qualquer por exemplo "TESTE". O que a função faz é pegar em cada letra da palavra "TESTE" uma a uma, verificar a posição dela no alfabeto normal e substituir pela letra do alfabeto da lista de strings e vai pegando nos alfabetos da lista de strings um a seguir ao outro. A função getNewChar é a que procura pela posição do alfabeto e substitui por outra letra.

O que eu queria mesmo era fazer uma só função com o conteudo essas duas, porque só muda mesmo a troca daquelas duas variaveis e não ha necessidade de ter duas funções praticamente repetidas...

Posted

não sei se isto ajuda...

replaceCharsMulti :: Bool -> [string] -> [string] -> String -> String
replaceCharsMulti _ _ [] = []
replaceCharsMulti _ [] bak m = replaceCharsMulti flag bak bak m
replaceCharsMulti flag (x:xs) bak (y:ys) =
    let (s1,s2)=if flag then (abcList,x) else (x,abcList)
    in [getNewChar s1 s2 y] ++ (replaceCharsMulti flag xs bak ys)
Posted

Ajuda um bocadinho lol...

Isso foi algo em que eu tinha pensado para não ter de repetir o código da função, mas ajudou em usar o let/in po efeito porque eu ia ter um código mais estúpido. Assim fica mais bonito.

Eu só pensei que houvesse uma forma mais avançada de se fazer a coisa sem usar ifs, mas o melhor mesmo deve ser não inventar muito para já e deixar as coisas funcionais...

Thanks!

Posted

Eu só pensei que houvesse uma forma mais avançada de se fazer a coisa sem usar ifs, mas o melhor mesmo deve ser não inventar muito para já e deixar as coisas funcionais...

haver até acho que há, usando o curry's, uncurry's, split's e outras cenas do género, mas isso é um pouco complicado... parece-me que não se justifica estares a usar isso, pois com um pouco de sorte ficavas com o código maior.

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
×
×
  • 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.