Haskell 快速检查测试失败

Haskell 快速检查测试失败,haskell,quickcheck,Haskell,Quickcheck,我有一组简单的逆函数(简单的移位码): 通过一些简单的手动测试,它们可以很好地进行测试,但快速检查测试会报告失败: *** Failed! Falsifiable (after 8 tests and 4 shrinks): "\254" 0 但手动运行同样的测试效果很好: *Main> decode 0 ( encode 0 "\254") "c" 我不是问为什么它会失败(这是我要追问的),而是为什么当(看起来)同样的手工测试有效时quickCheck会失败 我怀疑这与字

我有一组简单的逆函数(简单的移位码):

通过一些简单的手动测试,它们可以很好地进行测试,但快速检查测试会报告失败:

*** Failed! Falsifiable (after 8 tests and 4 shrinks):
"\254"
0
但手动运行同样的测试效果很好:

   *Main> decode 0 ( encode 0 "\254")
   "c"
我不是问为什么它会失败(这是我要追问的),而是为什么当(看起来)同样的手工测试有效时quickCheck会失败

我怀疑这与字符编码有关,一个解码,另一个将其视为字符串,但不确定原因


这个问题是关于测试是如何工作的,而不是(目前!)函数或它失败的原因,但下面是代码:

import Data.Char
let2int c =  ord c - ord 'a'

int2let n =  chr (ord 'a' + n)

shift :: Int -> Char -> Char
shift n c | isLower c   =  int2let ((let2int c + n) `mod` 26)
          | otherwise   =  c

encode, decode :: Int -> String -> String
encode n xs  = [shift n x | x <- xs]
decode n     = encode (-n)

您提供的信息不足-下次请给出完整的测试和完整的代码。当将测试中的表达式应用于
quickCheck
的输出时,除了给出失败的结果之外,没有什么神奇的地方,也没有什么好的理由

根据你的代码,我认为你的测试是
解码0。编码0~id
。这不是真的,只需看看ghci的输出:

*Main Test.QuickCheck> quickCheck (\x -> x == decode 0 (encode 0 x))
*** Failed! Falsifiable (after 13 tests and 4 shrinks):    
"\244"
*Main Test.QuickCheck> decode 0 (encode 0 "\244")
"r"
*Main Test.QuickCheck> "\244" == "r"
False

实际测试是什么?查看
encode
decode
的定义可能也很有用。您需要在问题中包含失败测试的定义。您是否测试
encode n
decode n
是否相互相反?它们不是。谢谢,我被“\254”符号以及它是如何生成的弄糊涂了。我需要为快速检查创建一个经过消毒的可打印字符串生成器。您不需要新的生成器,只需从当前
任意
实例中筛选输入:
(\x->let y=filter isAscii x in y==decode 0(encode 0 y))
。是的,但我发现我得到的筛选块太多,速度非常慢,然后可能由于太多被丢弃的测试值而失败。(我使用了(\c->(isAlpha c)==>…)的过滤器。从中我认为我需要一个safeChar生成器,它工作得很好。谢谢。
quickCheck $ (\s n-> (decode n $ encode n s) == s)
*Main Test.QuickCheck> quickCheck (\x -> x == decode 0 (encode 0 x))
*** Failed! Falsifiable (after 13 tests and 4 shrinks):    
"\244"
*Main Test.QuickCheck> decode 0 (encode 0 "\244")
"r"
*Main Test.QuickCheck> "\244" == "r"
False