Soru QuickCheck Gen bir monad değil


Bazen, insanların, QuickCheck'teki Gen tipinin monad yasalarına uymadığını söyledim, ancak bununla ilgili bir açıklama görmedim. Şimdi, QuickCheck 2.7 Test.QuickCheck.Gen.Unsafe Modül, Gen'in sadece "ahlaki açıdan" bir monad olduğunu, ancak kısa bir açıklama ile başımı kaşıttığımı söylüyor. Gen'in monad yasalarını nasıl kırdığı konusunda adım adım bir örnek verebilir misiniz?


18
2018-06-30 00:50


Menşei


İçin monad yasalarını kodlayın Gen Quickcheck özellikleri olarak, aynı tohumla birlikte çalışır ve karşı metin örneklerinizi bulmanızı sağlar. :-) - luqui


Cevaplar:


Bir şeyi kanıtlamak istiyorsanız, bir monad o zaman monad yasalarını yerine getirdiğini kanıtlamanız gerekir. Işte bir tane

m >>= return = m

Belgeleri Gen ne olduğunu ima ediyor (=) Bu yasada aslında anlamına gelir. Gen değerler fonksiyonlardır, bu yüzden onları eşitlikle karşılaştırmak zordur. Bunun yerine, (>>=) ve return ve kanunun sahip olduğu eşit mantık yoluyla kanıtlamak

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))

Dolayısıyla, sonuçta, monad yasası, fst . split == id, değil ki. Ve yapmamalı.

Ama ahlaken, fst (split r) aynı r? Şey, sanki tohum değerine karşı cahil olduğumuza göre çalışıyoruz, evet, fst . split ahlaki olarak eşittir id. Gerçek değerler Gen-as-a-işlevi değişecektir, ancak değerlerin dağılımı değişkendir.

Ve belgelerin atıfta bulunduğu şey budur. Monad yasalarındaki eşitliğimiz, eşitlikçi değil, sadece "ahlaki açıdan" göz önünde bulundurularak Gen a değerler üzerinden olasılık dağılımı a.


25
2018-06-30 01:16