快速检查-功能中的非穷举模式-Haskell

时间:2018-11-06 10:35:03

标签: haskell ghci haskell-platform

我有两个功能。一种使用模式来实现,另一种使用密集型列表来实现。我想用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函数中的非穷尽模式   []

如何解决此问题? 谢谢

1 个答案:

答案 0 :(得分:0)

如果我们在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。尝试多使用标准库和高阶函数。