2016-09-02 21 views
5

Mamy dwie funkcje, które porównują 2 różne funkcje power i zwracają wartość true, jeśli zwracają tę samą wartość (na tym samym wejściu). Następnie mamy 2 inne funkcje, które testują te funkcje na 2 listach, aby zobaczyć, czy istnieje jakaś wartość, która nie zwraca true.Generuj tylko dodatnie liczby całkowite za pomocą QuickCheck

Zamiast używać list o numerach od [1..100], chcielibyśmy skorzystać z funkcji quickcheck. Więc możliwe jest szybkie sprawdzenie, aby tylko zwracać liczby całkowite.

Kod:

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

może będzie http://stackoverflow.com/questions/12466580/how-to-use-modifiers-with-quickcheck-positive-in-my-case pomóc? –

+0

@TomaszLewowski Niezupełnie. Nie rozumiem tej klasy/definicji '(Integral a, Show a, Read a) => ...' –

+0

jak używać modyfikatora 'suchThat' dla generatora? –

Odpowiedz

7

QuickCheck posiada wsparcie dla Positive numbers, ale przez wzgląd na tym tutorialu pokażę jak stworzyć swój własny generator. Jedną z głównych funkcji QuickCheck jest to, że możesz zaprojektować swój własny generator, aby uzyskać dokładnie to, czego potrzebujesz. Na przykład

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

Następnie można tworzyć własną listę genereator

genListOfPos :: Gen [Int] 
genListOfPos = listOf genPos 

Wreszcie można użyć forall, pass generator i zysków.

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

Thx, zadziałało! Pytanie: Dlaczego nie muszę stosować nowej listy do funkcji testowania lub przynajmniej usunąć istniejącą listę ('[1..100]')? A może moje pytanie powinno brzmieć: co dokładnie teraz robi ta funkcja z tą listą? –

+0

'all (> 0)' rozwija się do '\ xs -> all (\ x -> x> 0) xs' co oznacza zastosowanie' \ x -> x> 0' do każdego elementu 'xs', a następnie uruchomienie' wszystko, aby sprawdzić, czy wszystkie elementy są "Prawdziwe" – mariop

+0

W trosce o efektywność, może być lepiej wygenerować 'Słowo', dodać 1, rzucić do' Int', wziąć wartość bezwzględną, a następnie rzucić zero. Powodem, dla którego to * może * być lepsze, jest to, że wierzę, że QuickCheck zwykle próbuje wybrać głównie "małe" wartości, więc możesz mieć wiele zer do wyrzucenia. Zanim jednak skorzystasz z tej rady, musisz sprawdzić kilka szczegółów - mogę się mylić. – dfeuer