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

时间:2014-08-19 17:48:04

标签: haskell monads monad-transformers state-monad

我正在尝试使用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)

2 个答案:

答案 0 :(得分:4)

由于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

答案 1 :(得分:0)

好的,我已经找到了解决问题的方法。

由于MonadRandom的文档断言StateT PureMT m0可以被视为MonadRandom,我们可以“假装”randomN实际返回StateT PureMT m0。我们将选择m0作为标识monad,换句话说,我们可以表现为randomN具有签名

randomN :: StateT PureMT Identity Int

现在要取回我们简单解开的值: runIdentity (evalStateT (randomN) $ pureMT seed)