我有两个功能。一种使用模式来实现,另一种使用密集型列表来实现。我想用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函数中的非穷尽模式 []
如何解决此问题? 谢谢
答案 0 :(得分:0)
如果我们在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
。尝试多使用标准库和高阶函数。