【发布时间】:2018-11-06 10:35:02
【问题描述】:
我有两个功能。一种是使用模式实现的,另一种是使用密集列表实现的。我想用 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次测试): 例外: session4.hs:10:1-47:函数 cuadrados 中的非详尽模式 []
我该如何解决这个问题? 谢谢
【问题讨论】:
-
cuadrados'没有空列表案例,所以当 quickCheck 生成测试cuadrados [] == cuadrados' []时它会失败。 -
没错,您的
cuadrados'仅适用于非-空列表,您应该使用cuadrados' xs = cuadrados'' (pares xs),或者更好的事件cuadrados' = cuadrados'' . pares -
丢失的模式不仅可以由 QuickCheck 找到,如果您启用警告,GHC 本身也可以找到。
-
始终使用
-Wall编译确实是明智的:就像chi 所说,编译器已经可以生成未定义函数的模式列表。 -
不相关,但不要使用
[x] ++ y,x:y可以。另外,不要在不需要时重新实现map:cuadrados'' = map (^2)。
标签: haskell ghci haskell-platform