9

当我想测试纯代码时,QuickCheck我经常需要编写一个Arbitrary实例。要测试一元代码,我可以Test.QuickCheck.Monadic按照本文所述使用。

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

4

2 回答 2

6

Gen基本上是你用来Arbitrary在 monad 框架中处理实例的东西,因为Arbitrary类型类基本上只是生成器的提供者Gen a

于 2012-03-26T00:42:28.303 回答
3

随机生成上下文

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

随机生成一个动作

那么你到底想要生成什么?如果它是一个 monadic 动作,那么您需要根据其独特的原语为您的特定 monad提供一种生成 monadic 动作的方法。例如,随机生成的状态动作应该从状态原语getput.

把它们放在一起

如果您使用 QuickCheck 的功能来生成一个f产生单子动作的函数,并使用 QuickCheck 来生成一个 context c,那么您可以简单c >>= f地将它们放在一起。或者您可以简单地直接生成动作a,然后执行c >> a.

于 2012-03-26T03:38:12.760 回答