如何实现这样的数据类型的任意实例?

时间:2017-10-19 07:26:36

标签: haskell typeclass quickcheck

我是Haskell的新手,我正在尝试编写一个测试用例来证明Semigroup类型类的关联律。

数据类型定义如下:

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)

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

1 个答案:

答案 0 :(得分:3)

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

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