QuickCheck:根据其他任意对象定义任意实例
我正在使用 QuickCheck 1,并且具有以下数据类型:
data A = ...
instance Arbitrary A where ...
data B = ...
instance Arbitrary B where ...
data C = C A B
现在我想为 C
定义一个 Arbitrary
实例,以便 C
code> 值是使用 A
和 B
的现有生成器生成的。我最终这样做了:
instance Arbitrary C where
arbitrary = elements [(C a b) |
a <- generate 20 (System.Random.mkStdGen 0) arbitrary,
b <- generate 20 (System.Random.mkStdGen 0) arbitrary]
是否有必要为 A
和 B
显式生成固定数量的值,或者是否有更好的方法来组合现有的 Arbitraries< /code> 变成一个新的?
I'm using QuickCheck 1 and I've got the following data types:
data A = ...
instance Arbitrary A where ...
data B = ...
instance Arbitrary B where ...
data C = C A B
Now I'd like to define an Arbitrary
instance for C
so that C
values are generated using existing generators for A
and B
. I ended up doing this:
instance Arbitrary C where
arbitrary = elements [(C a b) |
a <- generate 20 (System.Random.mkStdGen 0) arbitrary,
b <- generate 20 (System.Random.mkStdGen 0) arbitrary]
Is this explicit generation of a fixed number of values for A
and B
necessary, or is there a better way of combining existing Arbitraries
into a new one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会这样做:
虽然 sclv 使用 Control.Monad 中的 liftM2 的想法可能更好:
I'd do it like this:
Although sclv's idea of using
liftM2
from Control.Monad is probably better: