나는 국가 모나드에 대한 튜토리얼을 통해 아이디어를 얻었다 고 생각합니다. this nice tutorial에서 예를 들어Haskell에서 숨겨진 방법으로 상태를 초기화하려면 어떻게해야합니까 (PRNG처럼)?
:
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 1
(16838,1103527590)
을하지만 난 여전히 PRNG에 내가 전화 할 때마다 씨앗을 전달해야
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
OK, 그래서 getRandom를 사용할 수 있습니다. 나는 하스켈 구현에서 사용할 수있는 PRNG가 필요하지 않음을 알고
Prelude> :module Random
Prelude Random> randomRIO (1,6 :: Int)
(...) -- GHC prints some stuff here
6
Prelude Random> randomRIO (1,6 :: Int)
1
그래서 아마 국가 모나드를 오해, 나는 대부분의 튜토리얼에서 볼 수있는 것을 는 "지속"상태가 될 것 같지 않기 때문에, 하지만 상태를 스레드하는 데 편리한 방법입니다.
그래서 ... 무작위 모듈 과 같이 자동으로 초기화되는 상태 (시간과 다른 예측할 수없는 데이터를 사용하는 일부 함수에서 가능)를 어떻게 가질 수 있습니까?
고맙습니다.
고마워요! 그것은 매우 도움이되었습니다. 귀하의 의견에 관해서는 "전자의 경우 다른 IO 계산에 넣지 않고서는 안된다"- 그 이유는 IO 모나드가 모나드 변압기를 사용하여 여러 개의 모나드를 결합 할 때 가장 내면에 있어야한다는 것입니다. – Jay
내가 생각하기에, PRNG는 필연적으로 IO 모나드를 사용할 것입니다. 맞습니까? 엔트로피가 필요하므로 "어딘가"의 데이터가 필요합니다. 실제로 * 투명하게 투명하지 않은 함수를 적어도 하나 필요로합니다 (그렇지 않으면 암호화 코드와 같이 유용하지 않습니다)! :-) – Jay