如何为这样的数据类型实现 Arbitrary 实例?

How to implement the Arbitrary instance for data type like this?

我是 Haskell 的新手,我正在尝试编写一个测试用例来证明半群类型类的结合律。

数据类型定义如下:

newtype Combine a b = Combine {unCombine :: (a -> b)}

Semigroup的实现如下:

instance (Semigroup b) => Semigroup (Combine a b) where 
  (Combine f) <> (Combine g) = Combine (\x -> f x <> g x)

我已经写了一个关联测试函数

assocTestFunc :: (Eq m, Semigroup m) => m -> m -> m -> Bool
assocTestFunc a b c = (a <> b) <> c == a <> (b <> c)

并且还定义了这样的类型别名:

type CombineAssoc = Combine String Ordering -> Combine String Ordering -> Combine String Ordering -> Bool

所以在我的主函数中,我可以这样测试它:

  quickCheck (assocTestFunc :: CombineAssoc)

但是我很难为 Combine a b 数据类型实现 Arbitrary 实例。 提前感谢您的帮助。

您可以利用函数的预定义实例。

instance (CoArbitrary a, Arbitrary b) => Arbitrary(Combine a b) where
   arbitrary = Combine <$> arbitrary