Haskell:如何证明(测试)自我定义的Monad实例是否遵循Monad法则?

Yel*_*sgg 2 monads haskell state-monad

不使用正式演绎,我如何测试自定义Monad实例是否符合Monad法则?

Mar*_*ann 6

FWIW,这里是我最近编写的一组QuickCheck属性,用于测试Monad定律,以获得源自其F-Algebra的Maybe实现:

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
Run Code Online (Sandbox Code Playgroud)

  • @Cubic OP使用两个术语(证明和测试),但似乎对测试感兴趣,而不是证明. (4认同)