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