2016-09-02 32 views
5

ile pozitif tamsayılar yaratın 2 farklı power işlevini karşılaştıran iki işlevi vardır ve aynı değeri (aynı girişte) döndürdüğünde true değerini döndürür. Daha sonra, gerçek olmayan herhangi bir değer olup olmadığını görmek için bu fonksiyonları 2 listeye karşı test eden 2 başka fonksiyona sahibiz.Sadece QuickCheck

Ancak, [1..100] aralığındaki listeleri kullanmak yerine quickcheck kullanmak istiyoruz. Yani, yalnızca tamsayıları döndürmek için quickcheck elde etmek mümkün.

Kodu:

comparePower1 :: Integer -> Integer -> Bool 
comparePower1 n k = power n k == power1 n k 

comparePower2 :: Integer -> Integer -> Bool 
comparePower2 n k = power n k == power2 n k 

testing1 = and [comparePower1 n k | n <- [0..100], k <- [0..100]] 
testing2 = and [comparePower2 n k | n <- [0..100], k <- [0..100]] 
+0

belki http://stackoverflow.com/questions/12466580/how-to-use-modifiers-with-quickcheck-positive-in-my-case yardımcı olacak? –

+0

@TomaszLewowski Gerçekten değil. Bu tip sınıfı/tanımı anlamamıştım ((Integral a, Show a, Read a) => ... –

+0

"suchThat" değiştiricisini nasıl kullanacağım? –

cevap

7

QuickCheck Positive numbers için desteği vardır, ancak bu yazının uğruna nasıl kendi Generator oluşturmak için size gösterecektir. QuickCheck'in temel özelliklerinden biri, ihtiyacınız olan şeyi çıkarmak için kendi jeneratörünüzü tasarlayabilmenizdir. Mesela

için
genPos :: Gen Int 
genPos = abs `fmap` (arbitrary :: Gen Int) `suchThat` (> 0) 

Sonra

genListOfPos :: Gen [Int] 
genListOfPos = listOf genPos 

Son olarak, forall kullanmak jeneratör ve kar geçebilir kendi liste genereator oluşturabilirsiniz.

main :: IO() 
main = do 
    quickCheck $ forAll genPos $ \x -> x > 0 
    quickCheck $ forAll genListOfPos $ all (> 0) 
+0

Thx, işe yaradı! Bir soru: Neden yeni listeyi test işlevine uygulamam ya da var olan listeyi oradan silmem gerek ('[1..100]')? Ya da belki de benim sorum şu olmalıydı, şu an bu listede ne yapıyor? –

+0

'tümü (> 0)' 'x' -> tümünü (\ x -> x> 0) xs' 'e genişletir; all 'tüm öğeleri olup olmadığını kontrol etmek için' True ' – mariop

+0

Verimlilik için, bir 'Word' oluşturmak, 1'i eklemek, Int' için cast, mutlak değeri almak ve sonra sıfır atmak daha iyi olabilir. Bunun * daha iyi olabileceğinin sebebi, QuickCheck'in normalde çoğunlukla "küçük" değerleri seçmeye çalıştığına inanıyorum ki bu yüzden atmak için çok fazla sıfırınız olabilir. Ancak bu tavsiyeyi almadan önce bazı detayları kontrol etmelisiniz, ancak yanılıyor olabilirim. – dfeuer