Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:如何证明(测试)自定义Monad实例是否遵循Monad定律?_Haskell_Monads_State Monad - Fatal编程技术网

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

Haskell:如何证明(测试)自定义Monad实例是否遵循Monad定律?,haskell,monads,state-monad,Haskell,Monads,State Monad,如果不使用形式演绎,我如何测试自定义的Monad实例是否遵循Monad定律?我想你知道什么是Monad定律,但为了完整性,我将继续讨论 因为您明确提到了测试而不是形式证明,所以您可以使用Haskell的一个自动化测试框架,例如or。FWIW,下面是我最近编写的一组快速检查属性,用于测试Monad定律,以实现从F-代数派生的可能实现: testProperty "Monad left identity law" $ do a :: String <- arbitrary k :: S

如果不使用形式演绎,我如何测试自定义的
Monad
实例是否遵循Monad定律?

我想你知道什么是Monad定律,但为了完整性,我将继续讨论


因为您明确提到了测试而不是形式证明,所以您可以使用Haskell的一个自动化测试框架,例如or。

FWIW,下面是我最近编写的一组快速检查属性,用于测试Monad定律,以实现从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
testProperty“Monad左标识法”$do
a::字符串可以是整数>=k
设right=ka
返回$left==right
,
testProperty“单子权利身份法”$do
m::MaybeFix整数>=返回
设右=m
返回$left==right
,
testProperty“单子关联律”$do
m::MaybeFix字符串MaybeFix整数MaybeFix排序>=(\x->kx>>=h)
设右=(m>>=k)>>=h
返回$left==right

这可能有点过头了,但您可以尝试一下,这可能会将您的hs代码转换为Coq代码,然后您可以证明有关使用的内容

有关使用Coq证明单子定律的示例(尽管这不是使用hs到Coq),请参见:

好的证明某种东西将意味着(形式上)对另一种数学技术的演绎(或矛盾)。没有它,你可以产生大量的经验证据,但这不是一个“证据”。然而,有些自动证明系统(“代码合同”)可能(也可能不)起作用。当然,但这不是证明,这只是经验evidence@CubicOP使用了两个术语(证明和测试),但似乎对测试感兴趣,而不是证明。很抱歉询问这么多细节,但是我如何才能做到这一点呢?@Yellowsgg这里发布的代码显示了三个内联属性,都是用英文编写的。有关我在Haskell中的测试方法的概述,您可以参考我的文章。