Guest id194 Posted November 12, 2006 at 04:38 PM Report #63856 Posted November 12, 2006 at 04:38 PM 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).
Rui Carlos Posted November 12, 2006 at 04:57 PM Report #63861 Posted November 12, 2006 at 04:57 PM dava jeito saber o que é que as funções fazem... Rui Carlos Gonçalves
Guest id194 Posted November 12, 2006 at 08:33 PM Report #63915 Posted November 12, 2006 at 08:33 PM 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...
Rui Carlos Posted November 13, 2006 at 12:14 AM Report #63982 Posted November 13, 2006 at 12:14 AM 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) Rui Carlos Gonçalves
Guest id194 Posted November 13, 2006 at 12:24 AM Report #63995 Posted November 13, 2006 at 12:24 AM 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!
Rui Carlos Posted November 13, 2006 at 02:46 PM Report #64075 Posted November 13, 2006 at 02:46 PM 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. Rui Carlos Gonçalves
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