测试使用MonadRandom类的函数

时间:2018-10-28 23:50:22

标签: haskell

是否可以实施合法的确定性MonadRandom,以种子或预定义的结果作为参数进行测试?

给予

yesOrNo :: (MonadRandom m) -> m Bool

从概念上讲,在测试过程中,该功能可以解析为:

yesOrNo :: Bool -> Bool
yesOrNo = id

我认为我可以实施

instance (MonadRandom ((->) StdGen))

instance (Random a) => (MonadRandom ((->) [a]))

但是我开始意识到这样的实例可能是没有用的,因为我不能以这种方式来线程化StdGen。

也许我需要一种通过其他操作扩展MonadRandom的方法,以便测试可以控制其行为?也许国家?我不确定应该采用哪种方法。

1 个答案:

答案 0 :(得分:2)

现有Rand实例已经遵守法律,并接受确定性行为的种子。看看:

> act = replicateM 10 getRandom :: Rand StdGen [Bool]
> runRand act (mkStdGen 1000)
([True,True,False,True,True,False,True,False,False,False],988833273 1336516156)
> runRand act (mkStdGen 1000)
([True,True,False,True,True,False,True,False,False,False],988833273 1336516156)
> runRand act (mkStdGen 1000)
([True,True,False,True,True,False,True,False,False,False],988833273 1336516156)