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工作原理的进一步见解吗?