是否有与QuickCheck一起使用的Monadic版本的Arbitrary?

时间:2012-03-25 19:53:42

标签: testing haskell functional-programming monads quickcheck

当我想使用QuickCheck测试纯代码时,我经常需要编写一个Arbitrary实例。要测试monadic代码,我可以使用此article中描述的Test.QuickCheck.Monadic

我的问题是:是否有一些规范的方法来生成依赖于monadic上下文的数据?特别是,有任何monadic版本的任意?您将如何生成需要monadic上下文的数据?

2 个答案:

答案 0 :(得分:6)

Gen基本上是用于在monad框架中使用Arbitrary实例的,因为Arbitrary类型类基本上只是Gen a生成器的提供者。 / p>

答案 1 :(得分:3)

随机生成上下文

只需生成适当的随机monadic上下文。如果你正在进行测试,你不能留在纯粹想象的monad土地上,你实际上必须选择一个特定的monad来测试。你选择了monad列表吗?随机生成列表作为上下文。国家monad?随机生成上下文的状态类型的值。作家?随机生成日志。

随机生成动作

那么你想要生成什么呢?如果它是一个monadic动作,那么你需要提供一种基于其独特的原语为你的特定monad生成monadic动作的方法。例如随机生成的状态动作应该从状态原语getput中随机构建。

将它们放在一起

如果您使用QuickCheck的功能生成一个产生monadic动作的函数f,并使用QuickCheck生成上下文c,那么您只需c >>= f将它们组合在一起即可。或者,您只需直接生成操作a,然后执行c >> a