我有一组简单的逆函数(简单的移位代码):
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)