繁体   English   中英

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

[英]Haskell: How to prove(test) whether a self-defined Monad instance follow Monad laws?

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

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

我想你知道Monad法则是什么,但为了完整起见我会将它们联系起来

既然你明确提到的测试,而不是正式的证明,你可以使用自动测试框架Haskell的,例如一个快速检查Hspec

这可能有点超过顶部,但您可以尝试hs-to-coq ,这可能会将您的hs代码转换为Coq代码,然后您可以证明使用Coq(Proof Assistant)的事情。

有关使用Coq证明monad定律的示例(尽管这不是使用hs-to-coq),请参阅: https//github.com/jwiegley/coq-pipes#laws-proven

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM