是否可以实施合法的确定性MonadRandom
,以种子或预定义的结果作为参数进行测试?
给予
yesOrNo :: (MonadRandom m) -> m Bool
从概念上讲,在测试过程中,该功能可以解析为:
yesOrNo :: Bool -> Bool
yesOrNo = id
我认为我可以实施
instance (MonadRandom ((->) StdGen))
或
instance (Random a) => (MonadRandom ((->) [a]))
但是我开始意识到这样的实例可能是没有用的,因为我不能以这种方式来线程化StdGen。
也许我需要一种通过其他操作扩展MonadRandom
的方法,以便测试可以控制其行为?也许国家?我不确定应该采用哪种方法。
答案 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)