gpt4 book ai didi

haskell - 如何使用 QuickCheck2 预测异常

转载 作者:行者123 更新时间:2023-12-02 16:10:01 25 4
gpt4 key购买 nike

我最近一直在尝试学习 Haskell,但是我在使用 QuickCheck2 时遇到了一些困难(我正在尝试在编写 99 个问题的同时学习它)。我看过this question以及与此事相关的内容。

就像上述问题中的OP一样,我有兴趣了解 QuickCheck2 是否有可能预期异常。我知道 QuickCheck 1 可以实现这一点。通过谷歌搜索,我找到了以下版本的代码来测试返回列表最后一个元素的 myLast 函数:

prop_myLast :: [Int] -> Bool
prop_myLast [] = expectFailure . myLast $ []
prop_myLast xs = myLast xs == last xs

当然,这 (1) 不会进行类型检查,因为 expectFailure 返回一个 Property 并且 (2) 需要从 QuickCheck v1 导入。关于(1),我真的不知道如何完成这项工作 - 我尝试自行查找如何捕获异常,但遇到了更多困难,因为这开始引入 IO monad。关于 (2),我不知道首先引入 expectFailure 函数是否是一个好主意 - 有系统经验的人可以告诉我是否应该使用组件来自 v1 和 v2?如果没有,QuickCheck v2 的类似 expectFailure 在哪里?

最佳答案

您可以像这样使用expectFailure:

prop :: Int -> Bool
prop x = x + 1 == x -- should always be False

main = quickCheck (expectFailure prop)

但是,expectFailure 仅测试至少有一个测试用例失败 - 即它确实期望您的代码失败。您希望 QuickCheck 在将空列表传递给 prop_myLast 时忽略任何失败。

实现此目的的一种方法是使用 ==> 运算符:

prop_myLast :: [Int] -> Property
prop_myLast xs = not (null xs) ==> myLast xs == last xs

另一个例子:

prop_cubed :: Int -> Property
prop_cubed x = (x > 1) ==> x^3 > x -- note: not true for negative values so don't
-- test those cases

Quickcheck 将丢弃生成的与条件不匹配的测试用例。

更新:显式测试 [] 情况的一种方法是:

quickCheck $ expectFailure $ seq (myLast []) True

表达式seq a True将返回True,除非a抛出异常或发散。

关于haskell - 如何使用 QuickCheck2 预测异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com