Haskell quickCheck-获取并修改生成的参数
我编写了一个具有以下函数类型的加密和解密函数:Haskell quickCheck-获取并修改生成的参数,haskell,Haskell,我编写了一个具有以下函数类型的加密和解密函数: encrypt::[Char]->[Char]->[Char] decrypt::[Char]->[Char]->[Char] 这些功能经过手动测试,工作正常。唯一的问题是他们只使用大写字母 我还编写了一个测试属性函数,它通过上述两个函数对mssg加密并解密其加密。然后将解密与mssg进行比较,以确保一切正常m代表mssg,k代表钥匙 test::[Char]->[Char]->Bool test [] []
encrypt::[Char]->[Char]->[Char]
decrypt::[Char]->[Char]->[Char]
这些功能经过手动测试,工作正常。唯一的问题是他们只使用大写字母
我还编写了一个测试属性函数,它通过上述两个函数对mssg
加密并解密其加密。然后将解密与mssg
进行比较,以确保一切正常m
代表mssg,k
代表钥匙
test::[Char]->[Char]->Bool
test [] [] = True
test m k = m == (decrypt (encrypt m k) k)
现在我想在测试中使用quickCheck随机生成消息和密钥。这是为了自动化测试
main = print $ quickCheck test
不过,quickCheck也会生成小写字母,我不希望这样。我希望能够修改quickCheck生成的参数,使其仅包含大写字母。我该怎么做呢?由于约瑟杜索尔只给出了一个非常不完整的答案,我会尽力帮助你 首先看一下代码:
module Test where
import Test.QuickCheck
newtype OnlyUpper = OU String
deriving Show
encrypt :: String -> String -> String
encrypt _ msg = reverse msg
decrypt :: String -> String -> String
decrypt _ msg = reverse msg
test :: OnlyUpper -> OnlyUpper -> Bool
test (OU msg) (OU key) = msg == (decrypt key . encrypt key) msg
main :: IO ()
main = quickCheck test
instance Arbitrary OnlyUpper where
arbitrary = fmap OU $ listOf $ choose ('A', 'Z')
如您所见,我为encrypt
和decrpyt
选择了一个非常愚蠢的实现(为了方便起见,我切换了参数)
此外,我还删除了main
中的错误(无需打印
)
重要的部分是:我引入了一个newtype OnlyUpper
,并将其作为任意
的一个实例—这样QuickCheck就知道如何处理它(只生成大写字符的列表)
为了让您的测试使用它,您现在当然必须接受类型为OnlyUpper
的参数才能使用(我相应地更改了您的一个测试)-只需当场解构它((OU msg)
),其余的都应该是一样的
也许你不知道这里的
fmap
是怎么回事-然后事情是arbitral
是一个函子,listOf$choose('a','Z')
会给你'a'
和'Z'
之间的字符列表-但是你必须把它包装到OU
中,这样你才能得到onlyuper
(而不是[Char]
)-这就是你在这里所做的fmap
。这与问题有关吗?不。我与这个问题无关。也许你有同一位老师?-好吧,不管怎样-Joes的答案没那么糟糕;)很有道理。你能提供一点关于fmap工作原理的进一步见解吗?