当我想用QuickCheck
测试纯代码时,我经常必须编写一个Arbitrary
实例。要测试一元代码,我可以使用Test.QuickCheck.Monadic
,如article中所述。是否有与QuickCheck一起使用的Monadic版本的任意版本?
我的问题是:是否有一些规范的方式来生成依赖于monadic上下文的数据?特别是,有没有一些单调的任意版本?你将如何去生成需要单一上下文的数据?
当我想用QuickCheck
测试纯代码时,我经常必须编写一个Arbitrary
实例。要测试一元代码,我可以使用Test.QuickCheck.Monadic
,如article中所述。是否有与QuickCheck一起使用的Monadic版本的任意版本?
我的问题是:是否有一些规范的方式来生成依赖于monadic上下文的数据?特别是,有没有一些单调的任意版本?你将如何去生成需要单一上下文的数据?
只生成适当的随机一元上下文。如果你正在进行测试,你不能留在纯虚拟的monad土地上,你实际上必须选择一个特定的monad来测试。你选了单子单子吗?随机生成一个列表作为上下文。国家monad?随机地为上下文生成一个状态类型的值。作家?随机生成一个日志。
那么你想要产生什么,完全是什么?如果它是一次性动作,那么您需要提供一种基于其独特基元为您的特定monad生成一次性动作的方法。例如随机生成的状态行为应该从状态原语get
和put
中随机构建。
如果使用快速检查的能力,以产生一个功能f
产生一个单子的行动,并使用快速检查,以产生一个上下文c
,那么你可以简单地c >>= f
把它们放在一起。或者您可以直接生成动作a
,并执行c >> a
。
Gen
基本上是你用于在monad框架中使用Arbitrary
实例的原因,因为Arbitrary
类型类基本上只是Gen a
生成器的提供者。