I have a game , user vs computer and I want to randomly choose who starts the game. I have
a = getStdRandom $ randomR (0, 1)
This gets a random number 0 or 1. However it is a
IO Int, so I can't have an if statement comparing it to a number like
if a == 0 then userStarts else computerStarts
I have tried to compare
IO Int with
IO Int and it doesn't work, and I have also tried
I am very new to Haskell, not sure how to approach this. Code details requested:
randomNumber = getStdRandom $ randomR (0, length symbols - 5) -- this will be 0 or 1 randomNumber2 = getStdRandom $ randomR (0, length symbols - 5) -- according to -- the solution I need another function returning IO int. a = do x <- randomNumber randomNumber2 $ pureFunction x
Error I get:
• Couldn't match expected type ‘t0 -> IO b with actual type ‘IO Int’ • The first argument of ($) takes one argument, but its type ‘IO Int’ has none In a stmt of a 'do' block: randomNumber2 $ pureFunction x In the expression: do x <- randomNumber randomNumber2 $ pureFunction x • Relevant bindings include a :: IO b (bound at Path:87:1) randomNumber2 $ pureFunction x Path:89:20: error: Variable not in scope: pureFunction :: Int -> t0 randomNumber2 $ pureFunction x
When you say
a = getStdRandom $ randomR (0,1) you are saying "let a be the action of getting a random value between 0 and 1". What you want is within some function's do block
a <- getStdRandom $ randomR (0,1) which is "let a be the result of running the action of getting a random value between 0 and 1".
import System.Random main :: IO () main = do a <- getStdRandom $ randomR (0, 1 :: Int) if a == 0 then userStarts else computerStarts -- Placeholders for completeness userStarts, computerStarts :: IO () userStarts = putStrLn "user" computerStarts = putStrLn "computer"
N.B. I specified the
1 is an int or else the compiler won't know if you want a random int, int64, double, float, or something else entirely.
EDIT: @monocell makes a good point that generating an int in a range just to get a boolean is somewhat indirect. You can just directly generate a boolean result and this requires no range:
a <- getStdRandom random if a then userStarts else computerStarts