haskell - 如何使用 QuickCheck 来测试函数是否终止?

标签 haskell quickcheck

我想使用 QuickCheck 来测试函数以确保它终止(没有无限递归、没有抛出异常等)。这就是我现在所做的:

f :: Int -> Int -> Int

prop_fTerminates :: Int -> Int -> Bool   -- say
prop_fTerminates x y = f x y `seq` True

有更好的(更具表现力和惯用的)方式吗?

最佳答案

这是halting problem 。没有算法能够告诉您函数是否终止。

特别是,如果您愿意等待足够长的时间,您可能能够得到积极的结果(即,如果函数确实终止,这个命题会告诉您)。但仅通过等待,您永远无法知道此函数未终止此函数尚未终止之间的区别。

您可以实现类似此函数是否在时间 T 内终止之类的检查,这可能适合您的需求。

<小时/>

编辑 正如所写,您的函数无法满足您的要求。考虑一下

> let f = 1:f
> f `seq` True
True

原因是 seq 的计算结果仅为 weak head normal form 。相反,您可以使用 deepseq 来深入评估数据结构,

> import Control.DeepSeq (deepseq)
> f `deepseq` True
* never returns *

关于haskell - 如何使用 QuickCheck 来测试函数是否终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39242618/

相关文章:

haskell - 为什么我的程序在播放光泽动画后立即退出?

haskell - Acid-state:更新的 MonadState 实例

performance - 使用toList不好吗?

haskell - 如何测试 Applicatives 上的多态函数?

haskell - 在 Haskell 中通过引用传递?

haskell - 在 Haskell 中同时进行递归和计数

haskell - 对于 Haskell 的 QuickCheck,什么是收缩?

haskell - 如何将 QuickCheck 参数限制为非空字符串列表?

haskell - 使用快速检查

haskell - 如何在main中使用quickcheck