Я просмотрел некоторые учебники по государственной монаде, и я думаю, что у меня есть идея.Как я могу инициализировать состояние скрытым способом в Haskell (как это делает PRNG)?
Например, как в this nice tutorial:
import Data.Word
type LCGState = Word32
lcg :: LCGState -> (Integer, LCGState)
lcg s0 = (output, s1)
where s1 = 1103515245 * s0 + 12345
output = fromIntegral s1 * 2^16 `div` 2^32
getRandom :: State LCGState Integer
getRandom = get >>= \s0 -> let (x,s1) = lcg s0
in put s1 >> return x
ОК, так что я могу использовать getRandom:
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 1
(16838,1103527590)
Но мне еще нужно пройти семена на ПСЧ каждый раз, когда я называю его. Я знаю, что ПСЧ доступны в реализации Haskell не нужно, что:
Prelude> :module Random
Prelude Random> randomRIO (1,6 :: Int)
(...) -- GHC prints some stuff here
6
Prelude Random> randomRIO (1,6 :: Int)
1
Так что я, вероятно, не поняли государство монады, потому что я мог видеть в большинстве учебных пособий , кажется, не быть «стойкими» состояние, но просто удобный способ для потокового состояния.
Итак, как я могу получить состояние, которое автоматически инициализируется (возможно, из некоторой функции , которая использует время и другие не очень прогнозируемые данные), например, случайный модуль ?
Большое спасибо!
Спасибо! Это было очень полезно. Что касается вашего комментария, «в первом мы не можем не помещать его в другое вычисление ввода-вывода» - я полагаю, поэтому монада IO должна быть самой внутренней, когда вы объединяете несколько монадов (используя монадные трансформаторы)? – Jay
Теперь, когда я думаю об этом, PRNG обязательно будет использовать монашу IO, верно? Он нуждается в энтропии, поэтому ему нужны данные из «где-то». Это на самом деле * нуждается в * по крайней мере одной функции, которая не является ссылочной прозрачностью (в противном случае это было бы не полезно, например, для криптографического кода)! :-) – Jay