2017-10-19 77 views
2

我是Haskell的新手,我正在尝试编写一个测试用例来证明Semigroup typeclass的关联定律。如何实现像这样的数据类型的任意实例?

数据类型定义如下:

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

如随后半群的实施:

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实例。 感谢提前寻求帮助。

回答

3

您可以利用预定义的实例来执行功能。

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

补充说明'Combine'需要一个'Show'实例,或者必须和'Blind'一起使用。否则'quickCheck(assocTestFunc :: ...)'不会进行类型检查。 – Zeta

+1

不仅如此,还需要'Eq'实例。 –

+0

是的,你们都是对的,是否有可能给这个数据类型的Show实例和Eq实例的完整实现?谢谢! – PoppinDouble