nuno35 Posted October 19, 2018 at 11:17 AM Report #612119 Posted October 19, 2018 at 11:17 AM Ola outra vez estou aqui com um problema tenho este código: movel :: [Char] -> Char movel_2 [] = " " movel_2 (x:xs) | x!!0 == "2" = "abc" | x!!0 == "3" = "def" | x!!0 == "4" = "ghi" | x!!0 == "5" = "jkl" | x!!0 == "6" = "mno" | x!!0 == "7" = "pqrs" | x!!0 == "8" = "tuv" | x!!0 == "9" = "wxyz" |otherwise = " " à frente de cada linha depois é para fazer a chamada recursiva mas por enquanto assim já me esta a dar um erro (Couldn't match type ‘Char’ with ‘[[Char]]’) supostamente penso que agr o erro seja por causa da comparação alguém me pode explicar sff é para receber uma coisa assim ["2","33","2"] entao o x primeiro vai ser o 2 e o x!!0 tambem dois estou a por a primeira posição porque podem aparecer 22 Desde Já Obrigado
pdfrod Posted October 19, 2018 at 03:39 PM Report #612121 Posted October 19, 2018 at 03:39 PM (edited) Na primeira declaração, a função chama-se movel mas a seguir chama-se movel_2. Foi algum erro a fazer copy-paste para o fórum? E os tipos das coisas não estão a bater certo. Olhando para o tipo que foi declarado para a função movel, o x deveria ser um simples Char mas depois está a ser usado como se fosse uma String. Se calhar o tipo que querias declarar para a função era: movel_2 :: [String] -> String E depois em vez de == "2" deveria ser == '2' (single quote em vez de double quotes), porque só queres comparar um carácter e não a string toda. Edited October 19, 2018 at 03:48 PM by Kimio 1 Report
nuno35 Posted October 21, 2018 at 02:15 PM Author Report #612127 Posted October 21, 2018 at 02:15 PM Obrigado pela ajuda era mesmo esse o problema mas agr continuo com o problema e nao percebo muito bem porque o código agr esta assim: movel_2 :: [String] -> String movel_2 [] = " " movel_2 (x:xs) | x!!0 == '2' = "abc"!!length x - 1 | x!!0 == '3' = "def"!!length x - 1 | x!!0 == '4' = "ghi"!!length x - 1 | x!!0 == '5' = "jkl"!!length x - 1 | x!!0 == '6' = "mno"!!length x - 1 | x!!0 == '7' = "pqrs"!!length x - 1 | x!!0 == '8' = "tuv"!!length x - 1 | x!!0 == '9' = "wxyz"!!length x - 1 |otherwise = " " a frente de cada guarda será para fazer a chamada recursiva do xs mas assim já me esta a dar erro esta dar um erro parecido agr assim: Couldn't match type ‘Char’ with ‘[Char]’ Expected type: String Actual type: Char Desde Já Obrigado
Rui Carlos Posted October 21, 2018 at 03:54 PM Report #612128 Posted October 21, 2018 at 03:54 PM Não te falta aí a chamada recursiva? Rui Carlos Gonçalves
pdfrod Posted October 21, 2018 at 05:12 PM Report #612129 Posted October 21, 2018 at 05:12 PM É um problema parecido ao primeiro - o compilador está-te a dizer que os tipos não estão a bater certos. "abc"!!length x - 1 retorna um Char, mas noutras partes da função estás a retornar uma String (e.g, movel_2 [] = " "). Ou passas tudo para Char, ou tudo para String.
nuno35 Posted October 21, 2018 at 08:47 PM Author Report #612132 Posted October 21, 2018 at 08:47 PM Muito Obrigado já consegui resolver todos os problemas, acabei por colocar tudo em Char, agr tenho aqui outra situação que é: até agr estava a fazer o programar para receber uma coisa deste género ["222"," ","2","333"," ","33"], no entanto ele é suposto receber isto "222 2333 33" para passar de uma para a outra é fácil estou a usar a função group do modulo Data.List, agr eu posso fazer isto numa função a parte e dps chamar esta mas estava a tentar fazer tudo na mesma e estava a tentar fazer isto: movel_2 :: [String] -> [Char] movel_2 [] = "" movel_2 (group(x:xs)) mas nao me esta a dar e esta a dar alguns erros. Desde já Obrigado
Rui Carlos Posted October 21, 2018 at 09:00 PM Report #612133 Posted October 21, 2018 at 09:00 PM É possível fazeres tudo na mesma função, mas só vais complicar, e tornar o código menos legível (e na solução que estou a pensar, menos eficiente). Em geral, deves privilegiar função pequenas e simples (mesmo que precises de mais funções), a funções complexas. Rui Carlos Gonçalves
nuno35 Posted October 22, 2018 at 06:20 PM Author Report #612138 Posted October 22, 2018 at 06:20 PM eu tambem tinha pensado em fazer outra função e como dizem que é melhor vou optar por isso no entanto é uma função muito simples apenas para chamar a outra. teclasparapalavras :: String -> [String] teclasparapalavras frase = movel_2 (group frase) mas isto tambem me esta a dar erro Couldn't match type ‘Char’ with ‘[Char]’ Expected type: [String] Actual type: [Char]
Rui Carlos Posted October 22, 2018 at 06:31 PM Report #612139 Posted October 22, 2018 at 06:31 PM O tipo de retorno dessa função deverá ser o tipo de retorno da função movel_2 (ou seja, [Char] ou String). O facto da função ser simples é bom, pois significa que o código deverá ser fácil de ler. Rui Carlos Gonçalves
nuno35 Posted October 22, 2018 at 08:22 PM Author Report #612144 Posted October 22, 2018 at 08:22 PM já consegui muito obrigado ainda nao percebi bem esta parte da assinatura das funções geram me sempre problemas e muitos deles simples e eu fico preso. por exemplo qual é a diferença entre String e [Char] a única diferença que vejo no meu programa é que em [Char] usa se ' ' e em String usa se " " Desde já Obrigado
Rui Carlos Posted October 22, 2018 at 09:25 PM Report #612145 Posted October 22, 2018 at 09:25 PM String e [Char] é a mesma coisa (representam listas de caracteres). Em ambos os casos usas "" (e.g. "uma string", "uma lista de caracteres"). Char é que é diferente (representam um único carácter). Aqui usas '' (e.g. 'a', '1'). 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