当我想使用QuickCheck
测试纯代码时,我经常需要编写一个Arbitrary
实例。要测试monadic代码,我可以使用此article中描述的Test.QuickCheck.Monadic
。
我的问题是:是否有一些规范的方法来生成依赖于monadic上下文的数据?特别是,有任何monadic版本的任意?您将如何生成需要monadic上下文的数据?
答案 0 :(得分:6)
Gen
基本上是用于在monad框架中使用Arbitrary
实例的,因为Arbitrary
类型类基本上只是Gen a
生成器的提供者。 / p>
答案 1 :(得分:3)
只需生成适当的随机monadic上下文。如果你正在进行测试,你不能留在纯粹想象的monad土地上,你实际上必须选择一个特定的monad来测试。你选择了monad列表吗?随机生成列表作为上下文。国家monad?随机生成上下文的状态类型的值。作家?随机生成日志。
那么你想要生成什么呢?如果它是一个monadic动作,那么你需要提供一种基于其独特的原语为你的特定monad生成monadic动作的方法。例如随机生成的状态动作应该从状态原语get
和put
中随机构建。
如果您使用QuickCheck的功能生成一个产生monadic动作的函数f
,并使用QuickCheck生成上下文c
,那么您只需c >>= f
将它们组合在一起即可。或者,您只需直接生成操作a
,然后执行c >> a
。