Od czasu do czasu widzę ludzi, którzy mówią, że typ Gen w QuickCheck nie przestrzega praw monady, chociaż nie widziałem zbyt wiele wyjaśnień, aby z nim poradzić. Teraz moduł QuickCheck 2.7, Test.QuickCheck.Gen.Unsafe mówi, że Gen jest tylko "moralnie" monadą, ale krótkie wyjaśnienie pozostawia mi drapanie w głowę. Czy możesz podać krok po kroku, jak Gen łamie prawa Monady?QuickCheck Gen nie jest monadą
Odpowiedz
Jeśli chcesz udowodnić, że coś jest monadą, musisz udowodnić, że spełnia ona prawa monad. Oto jeden
m >>= return = m
Dokumentacja Gen
odnosi się do tego, co (=)
w tej ustawie w rzeczywistości oznacza. Gen
wartości są funkcjami, więc trudno jest je porównać dla równości. Zamiast tego, możemy inline definicje (>>=)
i return
i udowodnić poprzez equational rozumowania, że prawo posiada
m = m >>= return
m = m >>= (\a -> MkGen (\_ _ -> a))
MkGen m = MkGen m >>= (\a -> MkGen (\_ _ -> a))
MkGen m = MkGen (\r n ->
let (r1,r2) = split r
MkGen m' = (\a -> MkGen (\_ _ -> a)) (m r1 n)
in m' r2 n
)
MkGen m = MkGen (\r n ->
let (r1,r2) = split r
MkGen m' = MkGen (\_ _ -> m r1 n)
in m' r2 n
)
MkGen m = MkGen (\r n ->
let (r1,r2) = split r
in (\_ _ -> m r1 n) r2 n
)
MkGen m = MkGen (\r n ->
let (r1,r2) = split r
in m r1 n
)
MkGen m = MkGen (\r -> m (fst $ split r))
Więc ostatecznie ustawa monada wydaje się nie trzymać, chyba fst . split == id
, which is doesn't. I nie powinien.
Ale moralnie, czy fst (split r)
jest takie samo jak r
? Cóż, dopóki działamy tak, jakbyśmy nie mieli pojęcia o wartości nasion, tak, tak, fst . split
jest moralnie równoważne z id
. Rzeczywiste wartości generowane przez Gen
-as-a-function będą się różnić, ale rozkład wartości jest niezmienny.
I do tego odnosi się dokumentacja. Nasza równość w prawach monad nie ma charakteru równania, ale zamiast tego jest "moralnie" biorąc pod uwagę, że Gen a
jest rozkładem prawdopodobieństwa nad wartościami a
.
- 1. Dlaczego wartość powrotu windy nie jest monadą?
- 2. Użycie quickCheck
- 3. Jaki jest ogólny przypadek funkcji promującej QuickCheck?
- 4. Monadowe transformatory z monadą tożsamości
- 5. clojure gen-class varargs konstruktor
- 6. właściwości Warunkowe QuickCheck
- 7. Haskell Cabal QuickCheck Integration
- 8. StringTemplate dla gen kodu wykonawczego?
- 9. Dlaczego funkcja QuickCheck rezygnuje?
- 10. IO i Być może interakcja z monadą
- 11. Makro clojure przy użyciu klasy gen nie tworzy adnotacji
- 12. doker ubuntu/bin/sh: 1: locale-gen: Nie znaleziono
- 13. HUnit/QuickCheck z ciągłą integracją
- 14. Testy QuickCheck dla typów zależnych
- 15. Haskell QuickCheck minimalny licznik przykład
- 16. Dlaczego moja implementacja konwersji łuku SVG nie przechodzi testu QuickCheck?
- 17. Sprawdzone metody Haskell QuickCheck (szczególnie podczas testowania klas typów)
- 18. Idiomatic sposób, aby zmniejszyć rekord w QuickCheck
- 19. Haskell: Jak przetestować (reaktywny) FSM z quickcheck?
- 20. Jak używać 'oneof' w quickCheck (Haskell)
- 21. Running QuickCheck przeciwko Prosty test w/Funkcja
- 22. Jak mogę połączyć CheckingFuelMonad z Monadą Stanową w Hoopl?
- 23. Jak radzić sobie z monadą `Reader` i` Try`?
- 24. Testowanie działań IO za pomocą Monadic QuickCheck
- 25. Jak zaimplementować zwarcie z Monadą IO w Scali
- 26. Unikanie zagnieżdżonego dopasowywania wzorców (prawdopodobnie z być może monadą)
- 27. CATiledLayer usuwane i odświeżony natomiast powiększony iPada 3. gen
- 28. Jak utworzyć wiele zmiennych składowych Java z Clojure jest gen klasy
- 29. Nie można rozwiązać symbolu R, gdzie znajduje się folder gen w Android Studio?
- 30. QuickCheck: Arbitralne instancje zagnieżdżonych struktur danych, które generują zbilansowane próbki
Zakoduj prawa monad dla 'Gen' jako właściwości quickcheck, działając z tym samym nasieniem i pozwól, by szybkie sprawdzenie znalazło twoje kontrprzykłady. :-) – luqui