Jump to content
nuno35

Guardas

Recommended Posts

nuno35

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

Share this post


Link to post
Share on other sites
pdfrod

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 by Kimio
  • Vote 1

Share this post


Link to post
Share on other sites
nuno35

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 

Share this post


Link to post
Share on other sites
pdfrod

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

Share this post


Link to post
Share on other sites
nuno35

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

Share this post


Link to post
Share on other sites
Rui Carlos

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

Share this post


Link to post
Share on other sites
nuno35

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]

 

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
nuno35

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 

Share this post


Link to post
Share on other sites
Rui Carlos

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

Share this post


Link to post
Share on other sites

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.