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

Nazgulled

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

6 mensagens neste tópico

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

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