我为foldl写了一个实现,并想检查它是否有效,我尝试了一些案例,它似乎工作得很好,但我想确认一下。
我读过关于quickCheck的文章并尝试过,但我似乎不能让它工作,这是代码
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时,它抛出以下错误:
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发布于 2013-04-25 05:47:06
您的属性需要三个输入:一个函数、一个元素和一个列表。问题是QuickCheck不知道如何处理一般的函数。
QuickCheck需要做的一件事是,能够将失败的测试用例写入控制台。为此,它需要可以转换为String的值-- Show类中的任何值。因为函数不在Show中,所以它不能将它们用于输入。这就是你的错误信息的来源。
一般来说,使用随机生成的函数进行测试将是相当棘手的。我只需编写一些具体的函数,并让QuickCheck随机生成起始值和元素列表。
发布于 2013-04-25 10:17:20
有一种方法可以使用Blind修饰符来避免输入上的Show约束,这将允许您使用QuickCheck的机制来生成随机函数。
-- 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)
> quickCheck prueba
*** Failed! Falsifiable (after 4 tests and 2 shrinks):
(*)
0
[1,0]发布于 2013-04-25 05:47:34
据我所知,在QuickCheck (请参阅Test.QuickCheck.Function)中有创建随机函数的机制,但我不能说我对这个东西足够了解,无法告诉您如何使用它。
也就是说,使用您自己选择的函数测试您的属性可能更有意义,因此您可以编写类似quickCheck $ prueba (+)的代码,这样就可以很好地工作。
https://stackoverflow.com/questions/16201741
复制相似问题