Jump to content

Ajuda em função IO


Guest Kylops
 Share

Recommended Posts

Guest Kylops

Boa tarde, ando com um problema num exercício:

Defina uma função do tipo IO () que leia do teclado um inteiro n e imprima no écran os inteiros de 1 a n (um por linha).

Eu já tentei por várias maneiras mas dá-me sempre erro, geralmente erro de tipo.

limp :: IO ()
limp = do 
       x <- getLine   -- aqui guardo o inteiro no x, não conheço nenhum getInt por exemplo como o getChar, daí usar o getLine
       print [xs | xs <- [1..x]]

Sei que este código não está correcto, mas é a minha ideia de resolver o exercício, falta é concluir. O meu problema é arranjar maneira de imprimir os números, pensei em usar uma lista em compreensão porque é a única maneira em que consigo obter os números de 1 a x para os imprimir, depois usaria o \n para mudar de linha, mas não sei como o fazer encaixando-o ali.

Link to comment
Share on other sites

Boas, tens vários problemas aí.

1. Tens de passar de String para Int. Para isso podes usar a função read. Esta função serve para fazer "parsing" de uma string para um dado tipo, desde que este tipo seja instância da class Read (que é o caso do Int).

2. A função print pega num dado valor, obtem a sua representação textual (String) caso esse valor seja uma instância da class Show e mostra-o no ecrã com uma nova linha. O problema está que esse valor no teu caso é a lista de Ints. A melhor forma será criares uma função tua que recebe como parâmetro de entrada uma lista de Ints e percorre um a um usando a função print para mostrar no ecrã.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Guest Kylops

Agradeço desde já a resposta Betovsky.

Consegui fazer a função auxiliar:

print' :: [int] -> IO ()
print' [] = return ()
print' (x:xs) = do
                print x  
                print' xs 

Agora dá-me erro de tipo a função principal, sinceramente não percebi o read.

limp :: Read a => String -> a -> IO ()
limp = do 
       x <- getLine
       print' [1..x]
Link to comment
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
 Share

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