haskell - 如何在 QuickCheck 中使用自定义 listOf
问题描述
在我的代码中,我需要生成一个列表Point
我已经Point
在Arbitrary
类型类中实例化了自定义类型。到现在为止还挺好。
现在我需要生成一个列表: [Points]
但是 QuickCheck 生成的默认随机列表(使用listOf
我相信?)对我不起作用。因为我需要一些特殊的关系points
。我知道生成器组合器,例如。suchAs
但他们太慢了(因为非常罕见的关系)
我已经定义了一个Gen [Point]
适合我需要的定制。
randomBoard :: Gen [Point]
randomBoard = ...
但我不知道如何让我的测试Gen
在属性测试中使用这个自定义,因为它默认为listOf
生成的列表。
解决方案
IIUC,问题是您的测试正在使用Arbitrary
实例,Testable
例如 (Arbitrary a, Show a, Testable prop) => Testable (a -> prop)
.
获得自定义生成器的一种常见模式是newtype
使用所需的Arbitrary
实例抛出一些 s。所以你会定义类似的东西
newtype Board = Board [Point]
instance Arbitrary Board where
...
那会奏效。但我建议完全绕过并使用及其变体Arbitrary
编写您的属性。forAll
genBoard :: Gen [Point]
genBoard = ...
shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...
myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)
推荐阅读
- javascript - 反应函数中的类激活
- ios - 如何检测 TableViewCell 是否已被重用或创建
- javascript - 实时搜索和过滤 JavaScript
- c# - 如何在 C# 中使用 DocuSign API 签署 PDF?
- c# - C#类型作为带有索引器的对象
- python - 数据框中所有数据的箱线图:错误“'numpy.ndarray'对象没有属性'箱线图'”
- arrays - 将对象数组转换为ruby中的整数数组
- javascript - 我需要一个学校项目的帮助
- r - 从 data.frame 合并列出的 data.frames
- winapi - 您可以在 Windows API 中将 Edit 控件的编码设置为 UTF-8 吗?