Ir para conteúdo


Revista PROGRAMAR – Edição 46 (Setembro 2014): Download já disponível!

- - - - -

Bingo_randomRIO (Ajuda)


  • Por favor inicie sessão para responder
5 respostas a este tópico

#1 Mig_coiso

Mig_coiso

    null

  • Novo Membro
  • Pip
  • 3 mensagens

Publicado 20 de Janeiro de 2012 - 22:44

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.



Código (Haskell):
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

#2 Baderous

Baderous

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 2670 mensagens

Publicado 20 de Janeiro de 2012 - 22:49

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

Código (Haskell):
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
                            }


#3 Betovsky

Betovsky

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 1872 mensagens

Publicado 20 de Janeiro de 2012 - 22:52

Se estiver a ver bem:
Código (Haskell):
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".

#4 Mig_coiso

Mig_coiso

    null

  • Novo Membro
  • Pip
  • 3 mensagens

Publicado 20 de Janeiro de 2012 - 23:00

Código (Haskell):
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

#5 Betovsky

Betovsky

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 1872 mensagens

Publicado 20 de Janeiro de 2012 - 23:08

Bah! Obrigaste a abrir o ghci :)

Isto compila e funciona.
Código (Haskell):
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


#6 Mig_coiso

Mig_coiso

    null

  • Novo Membro
  • Pip
  • 3 mensagens

Publicado 20 de Janeiro de 2012 - 23:17

:) Nice!

Muito Obrigado.