[英]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
这可能有点超过顶部,但您可以尝试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.