2012-03-25 64 views
9

当我想用QuickCheck测试纯代码时,我经常必须编写一个Arbitrary实例。要测试一元代码,我可以使用Test.QuickCheck.Monadic,如article中所述。是否有与QuickCheck一起使用的Monadic版本的任意版本?

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

回答

3

随机生成上下文

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

随机产生一个动作

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

把它们放在一起

如果使用快速检查的能力,以产生一个功能f产生一个单子的行动,并使用快速检查,以产生一个上下文c,那么你可以简单地c >>= f把它们放在一起。或者您可以直接生成动作a,并执行c >> a

6

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

相关问题