我是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
实例。
感谢您提前寻求帮助。
答案 0 :(得分:3)
您可以利用函数的预定义实例。
instance (CoArbitrary a, Arbitrary b) => Arbitrary(Combine a b) where
arbitrary = Combine <$> arbitrary