Как вы используете значения IO Double
, полученные из генератора глобальных случайных чисел в Haskell в арифметических и логических операциях? Большинство учебных пособий в Интернете сосредоточены на получении случайных чисел, но почему-то я, похоже, не могу что-то сделать с ними.Использование случайных значений, полученных от генератора глобальных случайных чисел в Haskell в арифметических и логических операциях
Следующий код содержит некоторую функцию test
, содержащую некоторые из операций, которые я хочу выполнить.
{-# 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)
Тест функция не компилируется, так как нет ни одного случая для Ord (IO Double)
и Num (IO Double)
.
Обратите внимание, что я могу избежать IO Monad
путем внедрения генератора случайных чисел и отслеживания и передачи состояния. Но я предпочитаю учиться работать с Monads
вместо того, чтобы всегда пытаться убежать от них.
Тангенциального вопрос: есть ли какие-либо конкретные причины, почему вы используете '{- # LANGUAGE Строгий # -} '? – duplode
@duplode Очень эффективный критический код (практически только дробление числа). Мне на самом деле никогда не нужны плюсы ленивой оценки. – Matthias
Хорошо, это звучит разумно. – duplode