2017-10-19 115 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