[英]How to create a MonadRandom (StateT PureMT m0)? (Haskell)
我试图使用来自https://hackage.haskell.org/package/random-fu-0.2.6.0/docs/Data-Random.html#g:6的 MonadRandom
具体来说,我有一个带有类型签名的函数:
randomN :: MonadRandom m => m Int
我想用已知种子的Mersenne Twister来运行它。
如何从文档中“创建” Monad m0 => MonadRandom (StateT PureMT m0)
的实例?
由于MonadRandom
的实例已经存在于Monad m => StateT PureMT m
,你只需要像
-- State s a = StateT s Identity a
test :: State PureMT (Int, Int)
test = do
a <- randomN
b <- randomN
return (a, b)
你可以运行它
main :: IO ()
main = do
-- You can replace 1234 with whatever seed you want
let (result, finalState) = runState test $ pureMT 1234
putStr "The result: "
print result
putStr "The final state: "
print finalState
好的,我已经弄明白了如何解决我的问题。
由于MonadRandom
的文档断言StateT PureMT m0
可以被认为是MonadRandom,我们可以“假装” randomN
实际返回StateT PureMT m0
。 我们将选择m0
作为身份monad,换句话说,我们可以表现为randomN
具有签名
randomN :: StateT PureMT Identity Int
现在回到我们简单解runIdentity (evalStateT (randomN) $ pureMT seed)
的值: runIdentity (evalStateT (randomN) $ pureMT seed)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.