2015-09-22 8 views
7

Biorąc pod uwagę następujące elementy:Running QuickCheck przeciwko Prosty test w/Funkcja

test :: (Int -> Int) -> Int -> Bool 
test _ _ = True 

Po kompilacji źródła, próbuję uruchomić quickCheck test:

> quickCheck test 
<interactive>:27:1: 
    No instance for (Show (Int -> Int)) 
     arising from a use of ‘quickCheck’ 
    In the expression: quickCheck test 
    In an equation for ‘it’: it = quickCheck test 

Patrząc na ten Show instance for functions, wydaje mi się, że nie istnieje takie wystąpienie.

Jak mogę uruchomić quickCheck test, tzn. Obejść lub rozwiązać brakującą instancję Show dla Int -> Int?

Odpowiedz

8

QuickCheck ma specjalny moduł Test.QuickCheck.Function do generowania "funkcji", które można pokazywać (a także "zmniejszać", tak jak QuickCheck upraszcza kontr-przykłady). Możesz przekonwertować je na zwykłe funkcje za pomocą apply. Na przykład, jeśli masz plik:

import Test.QuickCheck 
import Test.QuickCheck.Function 

test :: Fun Int Int -> Int -> Bool 
test _ _ = True 

test2 :: Fun Int Int -> Int -> Bool 
test2 f x = apply f x == x 

Następnie w GHCi:

*Main> quickCheck test 
+++ OK, passed 100 tests. 
*Main> quickCheck test2 
*** Failed! Falsifiable (after 2 tests and 3 shrinks): 
{_->0} 
1 

To jest faktycznie możliwe do zdefiniowania funkcji instancji Show dla siebie, i używać. Ale jeśli Twój typ wejścia nie jest typu skończonego, takiego jak Bool, nie będzie można wydrukować wszystkich informacji o funkcji w ten sposób. Można zaimportować fałszywe wystąpienie, które pokazuje nie przydatne informacje od Text.Show.Functions.

Używany wcześniej typ Test.QuickCheck.Function.Fun wygląda tak, jakby został zaprojektowany w celu dostarczenia podstawowych informacji dużo bardziej zwięźle, więc z pewnością skorzystam z tego, jeśli to będzie możliwe.