【发布时间】:2018-10-25 02:51:05
【问题描述】:
我正在尝试做 Haskell Book(第 15 章,“Monoid,Semigroup”)中的 Monoid 练习之一,但我被卡住了。给出如下:
newtype Combine a b =
Combine { unCombine :: (a -> b) }
我应该为 Combine 编写 Monoid 实例。
我是这样写的:
instance (Semigroup b) => Semigroup (Combine a b) where
Combine { unCombine = f } <> Combine { unCombine = g } =
Combine { unCombine = \x -> f x <> g x }
instance (Monoid b) => Monoid (Combine a b) where
mempty = Combine { unCombine = \_ -> mempty }
mappend = (<>)
但我不知道如何为实例编写quickCheck。
这是我的尝试(不编译):
monoidLeftIdentity1 :: (Eq m, Monoid m) => m -> Bool
monoidLeftIdentity1 x = mappend mempty x == x
monoidRightIdentity1 :: (Eq m, Monoid m) => m -> Bool
monoidRightIdentity1 x = mappend x mempty == x
main :: IO ()
main = do
quickCheck (monoidLeftIdentity1 :: Combine Int (Sum Int) -> Bool)
quickCheck (monoidRightIdentity1 :: Combine Int (Sum Int) -> Bool)
看来我必须在这种类型上实例化Arbitrary 和Eq,但是如何为函数编写它们?
有一个similar question,在那个问题中,我们被要求为Combine 编写Semigroup 实例。
【问题讨论】:
标签: haskell quickcheck