首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用quickCheck

使用quickCheck
EN

Stack Overflow用户
提问于 2013-04-25 04:40:04
回答 3查看 2K关注 0票数 6

我为foldl写了一个实现,并想检查它是否有效,我尝试了一些案例,它似乎工作得很好,但我想确认一下。

我读过关于quickCheck的文章并尝试过,但我似乎不能让它工作,这是代码

代码语言:javascript
复制
foldl'' :: (b -> a -> b) -> b -> [a] -> b

test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool
test f e ls = foldl'' f e ls == foldl f e ls

当我运行quickCheck test时,它抛出以下错误:

代码语言:javascript
复制
No instance for (Show (b0 -> a0 -> b0))
  arising from a use of `quickCheck'
Possible fix:
  add an instance declaration for (Show (b0 -> a0 -> b0))
In the expression: quickCheck prueba
In an equation for `it': it = quickCheck prueba
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-25 05:47:06

您的属性需要三个输入:一个函数、一个元素和一个列表。问题是QuickCheck不知道如何处理一般的函数。

QuickCheck需要做的一件事是,能够将失败的测试用例写入控制台。为此,它需要可以转换为String的值-- Show类中的任何值。因为函数不在Show中,所以它不能将它们用于输入。这就是你的错误信息的来源。

一般来说,使用随机生成的函数进行测试将是相当棘手的。我只需编写一些具体的函数,并让QuickCheck随机生成起始值和元素列表。

票数 7
EN

Stack Overflow用户

发布于 2013-04-25 10:17:20

有一种方法可以使用Blind修饰符来避免输入上的Show约束,这将允许您使用QuickCheck的机制来生成随机函数。

代码语言:javascript
复制
-- Using Int instead of a, b which would be defaulted to () in GHCi
prueba :: Blind (Int -> Int -> Int) -> Int -> [Int] -> Bool
prueba (Blind f) e ls = foldl'' f e ls == foldl f e ls

也就是说,这意味着失败的输出对于调试几乎毫无用处,因为它只会为盲输入打印(*)。(为了演示,我定义了foldl'' = foldr . flip)

代码语言:javascript
复制
> quickCheck prueba 
*** Failed! Falsifiable (after 4 tests and 2 shrinks):    
(*)
0
[1,0]
票数 6
EN

Stack Overflow用户

发布于 2013-04-25 05:47:34

据我所知,在QuickCheck (请参阅Test.QuickCheck.Function)中有创建随机函数的机制,但我不能说我对这个东西足够了解,无法告诉您如何使用它。

也就是说,使用您自己选择的函数测试您的属性可能更有意义,因此您可以编写类似quickCheck $ prueba (+)的代码,这样就可以很好地工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16201741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档