FWIW, вот набор свойств QuickCheck, которые я недавно написал, чтобы проверить законы Монады для реализации Maybe, полученной из ее F-алгебры:
testProperty "Monad left identity law" $ do
a :: String <- arbitrary
k :: String -> MaybeFix Integer <- (fromMaybe .) <$> arbitrary
let left = return a >>= k
let right = k a
return $ left == right
,
testProperty "Monad right identity law" $ do
m :: MaybeFix Integer <- fromMaybe <$> arbitrary
let left = m >>= return
let right = m
return $ left == right
,
testProperty "Monad associativity law" $ do
m :: MaybeFix String <- fromMaybe <$> arbitrary
k :: String -> MaybeFix Integer <- (fromMaybe .) <$> arbitrary
h :: Integer -> MaybeFix Ordering <- (fromMaybe .) <$> arbitrary
let left = m >>= (\x -> k x >>= h)
let right = (m >>= k) >>= h
return $ left == right