How do you use `IO Double` values obtained from the global random number generator in Haskell in arithmetic and logic operations? Most tutorials on the internet focus on obtaining random numbers, but somehow I seem not to be able to do something useful with them.

The following code contains some function `test` containing some of the operations I want to perform. 

```
{-# LANGUAGE Strict #-}
module RNG where
import System.Random(setStdGen, mkStdGen, randomRIO)

seed_rng :: Int -> IO()
seed_rng seed = (setStdGen (mkStdGen seed))

uniform_float :: IO Double
uniform_float = (randomRIO (0.0, 1.0))

test :: Double -> Double -> IO Double
test a b = let u = (uniform_float)
              in if ((<) (return a) u) then ((+) (return b) u) else (return 2.0)

```

The test function does not compile since there is no instance for `Ord (IO Double)` and `Num (IO Double)`.

Note that I can avoid the `IO Monad` by implementing a random number generator and tracking+passing the state myself. But I rather learn to work with `Monads` instead of always trying to run away from them.