Haskell 如何在快速检查中使用自定义列表

Haskell 如何在快速检查中使用自定义列表,haskell,Haskell,在我的代码中,我需要生成一个点的列表 我已经在任意类型类中实例化了自定义类型点。 到目前为止还不错 现在我需要生成一个列表:[Points] 但是QuickCheck生成的默认随机列表(使用listOfI-crease?)对我不起作用。 因为我需要点之间的一些特殊关系。我知道生成器组合器,例如suchAs,但它们太慢了(因为关系非常罕见) 我已经定义了一个定制的Gen[Point]来满足我的需要 randomBoard :: Gen [Point] randomBoard = ... 但是我不

在我的代码中,我需要生成一个
点的列表

我已经在
任意
类型类中实例化了自定义类型
。 到目前为止还不错

现在我需要生成一个列表:
[Points]

但是QuickCheck生成的默认随机列表(使用
listOf
I-crease?)对我不起作用。 因为我需要
点之间的一些特殊关系。我知道生成器组合器,例如
suchAs
,但它们太慢了(因为关系非常罕见)

我已经定义了一个定制的
Gen[Point]
来满足我的需要

randomBoard :: Gen [Point]
randomBoard = ...

但是我不知道如何让我的测试在属性测试中使用这个定制的
Gen
,因为它默认为
listOf
生成的列表。

IIUC,问题是你的测试使用的是
任意的
实例,通过
可测试的
(任意a,显示a,可测试的属性)=>可测试的(a->prop

获取自定义生成器的常见模式是使用所需的
任意
实例抛出一些
newtype
s。所以你可以定义如下

newtype Board = Board [Point]

instance Arbitrary Board where
  ...
那就行了。但我建议您完全绕过
任意
,使用
for all
编写属性

genBoard :: Gen [Point]
genBoard = ...

shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...

myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)