2012-03-25 17 views
9

Kiedy chcę przetestować czysty kod przy użyciu QuickCheck, często muszę napisać instancję Arbitrary. Aby przetestować monadyczny kod, mogę użyć Test.QuickCheck.Monadic, jak opisano w tym article.Czy istnieje monadyczna wersja arbitralna do użycia z funkcją QuickCheck?

Moje pytanie to: Czy istnieje jakiś sposób kanonicznego generowania danych, które zależą od monadycznego kontekstu? W szczególności, czy istnieje jakaś monadyczna wersja arbitrażu? Jak byś zrobił generowanie danych wymagających monadycznego kontekstu?

Odpowiedz

3

losowo wygenerować kontekstu

Wystarczy wygenerować losowy jednowartościowy odpowiedni kontekst. Jeśli przeprowadzasz testy, nie możesz pozostać w czystej wyimaginowanej monadii, musisz wybrać konkretną monadę, aby ją przetestować. Wybrałeś monadę na liście? Losowo generuj listę jako kontekst. Monada państwowa? Losowo generuj wartość typu stanu dla kontekstu. Pisarz? Losowo generuj dziennik.

losowo generować akcję

Więc co chcesz wygenerować dokładnie? Jeśli jest to akcja monadyczna, musisz podać sposób generowania monadycznych akcji dla konkretnej monady, w oparciu o jej unikalne prymitywy. na przykład losowe generowane akcje stanu powinny być konstruowane losowo z prymitywów stanu get i put.

je razem

Jeśli używasz możliwości QuickCheck do generowania funkcji f że wytwarza jednowartościowy działań i używać QuickCheck wygenerować kontekstu c, to może po prostu c >>= f umieścić je razem. Możesz też bezpośrednio wygenerować akcję a i wykonać c >> a.

6

Gen jest w zasadzie to, czego używasz do pracy z Arbitrary przypadkach w ramach monady, ponieważ klasa Arbitrary typ jest w zasadzie tylko dostawcą Gen a generatorów.

Powiązane problemy