如何为这样的数据类型实现 Arbitrary 实例?
How to implement the Arbitrary instance for data type like this?
我是 Haskell 的新手,我正在尝试编写一个测试用例来证明半群类型类的结合律。
数据类型定义如下:
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)
但是我很难为 Combine a b
数据类型实现 Arbitrary
实例。
提前感谢您的帮助。
您可以利用函数的预定义实例。
instance (CoArbitrary a, Arbitrary b) => Arbitrary(Combine a b) where
arbitrary = Combine <$> arbitrary
我是 Haskell 的新手,我正在尝试编写一个测试用例来证明半群类型类的结合律。
数据类型定义如下:
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)
但是我很难为 Combine a b
数据类型实现 Arbitrary
实例。
提前感谢您的帮助。
您可以利用函数的预定义实例。
instance (CoArbitrary a, Arbitrary b) => Arbitrary(Combine a b) where
arbitrary = Combine <$> arbitrary