QuickCheck-函数中的非穷举模式-Haskell



我有两个函数。一个是使用模式实现的,另一个使用密集列表实现的。我想用QickCheck检查结果是否总是一样。

pares xs = [a | a <- xs , mod a 2 == 0]
cuadrados xs = [x^2 | x <- pares xs ]
cuadrados'' [] = []
cuadrados'' (x:xs) = [x^2] ++ cuadrados'' xs
cuadrados' (x:xs)  = cuadrados'' (pares (x:xs))

我正在尝试:

prop_cuadrados xs = cuadrados xs == cuadrados' xs

当我尝试quickCkeck prop_cuadrados时,输出如下:

*Main>quickCheck prop_cuadrados***失败!(1次测试后(:异常:sesion4.hs:10:1-47:函数cuadrados'中的非穷举模式[]

如何解决此问题?感谢

如果我们在GHC中应用-Wall(它会自动启用-Wincomplete-patterns(,或者只是手动尝试找到的反例,我们可以立即发现这个问题。

QuickCheck发现xs = []是反例。让我们来看看cuadrados':

cuadrados' []

在这一点上,我们不能继续,因为cuadrados'只结合在一个单一的模式上:(x:xs)。不幸的是,[]无法匹配该模式,您最终会出现错误。要修复它,只需添加另一种模式:

cuadrados' []     = []
cuadrados' (x:xs) = …

或者只使用

cuadrados' xs = cuadrados'' (pares xs)

因为我们没有显式地使用第一个元素。

也就是说,paresfilter even,而cuadradosmap (^2) . filter even。试着多使用一点标准库和高阶函数。

最新更新