我有两个函数。一个是使用模式实现的,另一个使用密集列表实现的。我想用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)
因为我们没有显式地使用第一个元素。
也就是说,pares
是filter even
,而cuadrados
是map (^2) . filter even
。试着多使用一点标准库和高阶函数。