繁体   English   中英

如何创建MonadRandom(StateT PureMT m0)? (Haskell的)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM