Haskell 快速检查仅限于某些数据构造函数

Haskell 快速检查仅限于某些数据构造函数,haskell,Haskell,我有一个数据类型定义: data Point = Point {x :: Int, h :: Int} | EmptyPoint 在我的属性测试中,我只想将测试限制在点构造函数的情况下。例如,点1-点2=点0。这假定已定义访问器x,但EmptyPoint的情况并非如此 换句话说:我不希望生成EmptyPoint 有什么方法可以做到这一点吗?您可以手动编写一个类,并让它生成您想要的点,而不是自动为您的类型派生任意类(我假设您目前正在这样做),例如: instance Arbitrary Poin

我有一个数据类型定义:

data Point = Point {x :: Int, h :: Int} | EmptyPoint
在我的属性测试中,我只想将测试限制在点构造函数的情况下。例如,点1-点2=点0。这假定已定义访问器
x
,但EmptyPoint的情况并非如此

换句话说:我不希望生成EmptyPoint


有什么方法可以做到这一点吗?

您可以手动编写一个类,并让它生成您想要的点,而不是自动为您的类型派生
任意
类(我假设您目前正在这样做),例如:

instance Arbitrary Point where
    arbitrary = Point <$> arbitrary <*> arbitrary
实例任意点,其中
任意=点任意
或者,如果您愿意,可以用更详细的方式:

instance Arbitrary Point where
    arbitrary = do
        x <- arbitrary
        y <- arbitrary
        pure Point { x, y }
实例任意点,其中
任意的

我不确定您的问题是否在于您想要限制对象的生成,或者您想要将“getter”
x
添加到
EmptyPoint
@WillemVanOnsem我想quickcheck会为类型点生成随机数据。我想要的是,它不会生成空点。您需要将
作为
任意
的实例。这意味着您可以指定如何生成任意
s,这正是您希望的方式。