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

Mig_coiso

Bingo_randomRIO (Ajuda)

6 mensagens neste tópico

Boas,

Alguem me consegue ajudar com este pedaço de código que me devolve o seguinte erro,

hs:13:28:

    The last statement in a 'do' construct must be an expression

Failed, modules loaded: none.

bingo :: IO()
bingo = do l <- acumulaValores []
           putStr (show l)

acumulaValores :: [int]->IO[int]
acumulaValores ns = if length ns == 90 then return ns
                    else do a <- randomRIO ((1::Int),(90::Int))
                                  let nl =if (elem a ns )then ns
                                         else a:ns
                                  in acumulaValores nl

Agradeço desde já a atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu costumo usar a notação com chavetas e ponto e vírgula, para ajudar a indentar:

bingo :: IO()
bingo = do { l <- acumulaValores [];
             putStr (show l)
           }

acumulaValores :: [int]->IO[int]
acumulaValores ns = if length ns == 90 then return ns
                    else do { a <- randomRIO ((1::Int),(90::Int));
                              let nl = if (elem a ns) then ns else a:ns;
                              in acumulaValores nl
                            }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se estiver a ver bem:

acumulaValores ns | length ns == 90 = return ns
                  | otherwise = do a <- randomRIO ((1::Int),(90::Int))
                                  let nl =if (elem a ns ) then ns else a:ns
                                  acumulaValores nl

Dentro da notação "do" só escreves "let".

Neste caso a função acumulaValores já retorna um IO, caso contrário teria que colocar um "return".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bingo :: IO()
bingo = do { l <- acumulaValores []
             putStr (show l)
           }


acumulaValores :: [int]->IO[int]
acumulaValores ns | length ns == 90 = return ns
                  | otherwise = do{ a <- randomRIO ((1::Int),(90::Int))
                                  let nl =if (elem a ns ) then ns else a:ns
                                  acumulaValores nl
                                 }

Continua a devolver o mesmo erro ... o pior é que nao consigo encontrar nada sobre este erro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bah! Obrigaste a abrir o ghci :)

Isto compila e funciona.

import Random

bingo :: IO ()
bingo = acumulaValores [] >>= print


acumulaValores :: [int]->IO[int]
acumulaValores ns | length ns == 90 = return ns
                  | otherwise = do
                       a <- randomRIO ((1::Int),(90::Int))
                       let nl = if (elem a ns ) then ns else a:ns
                       acumulaValores nl

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