2015-05-24 67 views
1

我寫的加密和解密函數用下面的函數類型:Haskell的快速​​檢查 - 抓鬥和修改生成的參數

encrypt::[Char]->[Char]->[Char] 
decrypt::[Char]->[Char]->[Char] 

這些功能是手動測試了與正常工作。唯一的是他們只用大寫字母。

我還寫了一個測試屬性函數,它通過上述2個函數加密一個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生成的參數,只包含大寫字母。我怎樣才能做到這一點?

+0

這與[此問題](https://stackoverflow.com/questions/30428408/haskell-quickcheck-generate-non-upper)? – Carsten

+0

沒有。我與這個問題無關。 –

+0

也許你有相同的老師? - 無論如何 - Joes的回答並不是那麼糟糕) – Carsten

回答

1

由於JosEduSol只給出了一個非常不完整的答案,我會盡量幫助你多一點。

先看看代碼:

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') 

,你可以看到我選擇encryptdecrpyt一個非常愚蠢的實現(和我交換的參數爲了方便)。

此外,我刪除了main中的錯誤(不需要print)。

重要的部分是:我介紹了一個newtype OnlyUpper和我做了它的Arbitrary一個實例 - 這樣快速檢查知道用它做(產生的僅上個字符名單)

爲了讓你的測試要使用它,你現在當然必須接受類型OnlyUpper的論據來處理(我相應地改變了你的一個測試) - 只需在現場解構((OU msg)),其餘的應該是相同的。

也許你不知道fmap是所有關於這裏的東西 - 那麼事情是Arbitrary是一個仿函數和listOf $ choose ('A', 'Z')給你'A''Z'之間的字符名單 - 但你必須包裝成OU這使你得到OnlyUpper(而不是[Char]) - 這就是fmap OU在這裏所做的。

+0

很有意義。你能否提供一些有關fmap如何工作的進一步見解? –