-1

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

  encode, decode :: Int -> String -> String

他们通过一些简单的手动测试进行了测试,但是 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)

参考:赫顿,2007

quickCheck $ (\s n-> (decode n $ encode n s) == s)
4

1 回答 1

1

您提供的信息不足 - 下次请提供完整的测试和完整的代码。当将测试中的表达式应用于输出时,quickCheck除了失败结果之外,没有任何魔法,也没有充分的理由。

根据您的代码,我认为您的测试是decode 0 . encode 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
于 2014-01-06T15:52:26.813 回答