Я пытаюсь написать простой генератор псевдослучайных чисел с использованием алгоритма Лемера, чтобы лучше понять, как обрабатывать значения ввода-вывода в Haskell, и я продолжаю получать несоответствия типов.
Мой код выглядит следующим образом:
import Data.Time.Clock.POSIX
generator :: Int -> Int -> Int -> Int
generator x i m
| i <= 0 = error "Index out of bounds"
| i == 1 = x * ( x `mod` m )
| otherwise = generator (generator x (i - 1) m) 1 m
pseudorand :: Int -> Int -> IO Int
pseudorand i m = do t <- round `fmap` getPOSIXTime
return ( \ i m -> generator t i m )
Функция генератора получает начальное число, число итераций и параметр по модулю и выполняет рекурсивное вычисление по модулю, где x_(i+1) = x_0 * x_i mod m
, достаточно просто. Получение миллисекундного времени как IO Int также выполнимо. Проблема, с которой я сталкиваюсь, заключается в том, чтобы потом передать IO Int на функцию генератора.
Приведенный выше код ожидает IO Int, но получает IO (Int -> Int -> Int). Это, очевидно, тип моей функции генератора, поэтому я попытался
pseudorand :: Int -> Int -> IO Int
pseudorand i m = do t <- round `fmap` getPOSIXTime
return ( fmap generator t i m )
, который ожидает Int, но получает Int -> Int.
Почему он не ожидает ввода? Почему он не видит i
и m
?
Также был бы признателен за ваш вклад в то, как вы написали бы код для этого