【发布时间】:2017-10-19 07:26:36
【问题描述】:
我是 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
所以在我的 main 函数中,我可以这样测试它:
quickCheck (assocTestFunc :: CombineAssoc)
但是,我很难为 Combine a b 数据类型实现 Arbitrary 实例。
提前感谢您的帮助。
【问题讨论】:
标签: haskell typeclass quickcheck