【发布时间】:2016-10-14 20:08:15
【问题描述】:
我现在正在阅读“Haskell Book”的幺半群部分,作者使用 QuickCheck 来检查幺半群定律。在自己写了一些东西之后,我有了这个代码:
module Main where
import Data.Monoid
import Test.QuickCheck
monoidAssoc :: (Eq m, Monoid m) => m -> m -> m -> Bool
monoidAssoc a b c = ((a <> b) <> c) == (a <> (b <> c))
monoidLeftId :: (Eq m, Monoid m) => m -> Bool
monoidLeftId a = (mempty <> a) == a
monoidRightId :: (Eq m, Monoid m) => m -> Bool
monoidRightId a = (a <> mempty) == a
type AssocCheck a = a -> a -> a -> Bool
type IdCheck a = a -> Bool
main :: IO ()
main = do
quickCheck (monoidAssoc :: AssocCheck (Maybe String))
quickCheck (monoidLeftId :: IdCheck (Maybe String))
quickCheck (monoidRightId :: IdCheck (Maybe String))
quickCheck (monoidAssoc :: AssocCheck [String])
quickCheck (monoidLeftId :: IdCheck [String])
quickCheck (monoidRightId :: IdCheck [String])
如您所见,main 函数有两个几乎相同的块,我想将其简化为这样的:
checkMonoid :: (Eq m, Monoid m) => m -> IO ()
checkMonoid = do
quickCheck (monoidAssoc :: AssocCheck m)
quickCheck (monoidLeftId :: IdCheck m)
quickCheck (monoidRightId :: IdCheck m)
main :: IO ()
main = do
checkMonoid :: Maybe String -> IO ()
checkMonoid :: [String] -> IO ()
但这显然行不通。我在这里想要以某种方式将类型传递给checkMonoid 函数,以便quickCheck 函数知道必须生成什么arbitrary 数据。
【问题讨论】: