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

Sign in to follow this  
Followers 0
Mig_coiso

Bingo_randomRIO (Ajuda)

6 posts in this topic

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

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
Sign in to follow this  
Followers 0