2014-06-30 8 views
18

मैंने कभी-कभी लोगों को यह कहते हुए देखा है कि क्विक चेक में जनरल प्रकार मोनैड कानूनों का पालन नहीं करता है, हालांकि मैंने इसके साथ जाने के लिए कोई स्पष्टीकरण नहीं देखा है। अब, क्विक चेक 2.7 के Test.QuickCheck.Gen.Unsafe मॉड्यूल का कहना है कि जनरल केवल "नैतिक रूप से" एक मोनड है, लेकिन छोटी व्याख्या मुझे मेरे सिर को खरोंच कर देती है। क्या आप एक चरण-दर-चरण उदाहरण दे सकते हैं कि कैसे जनरल मोनाद कानून तोड़ता है?क्विक चेक जनरल एक मोनड नहीं है

+13

'जेन' के लिए मोनैड कानूनों को क्विक चेक गुणों के रूप में एन्कोड करें, उसी बीज के साथ चलें, और अपने काउंटररेक्समल्स को त्वरित जांचें। :-) – luqui

उत्तर

25

यदि आप कुछ साबित करना चाहते हैं तो एक मोनाड है तो आपको यह साबित करना होगा कि यह मोनैड कानूनों को पूरा करता है। यहाँ एक

m >>= return = m 

Gen के लिए दस्तावेज़ क्या है कि कानून में (=) वास्तव में इसका मतलब है की चर्चा करते हुए है। Gen मान कार्य हैं, इसलिए समानता के लिए उनकी तुलना करना मुश्किल है। इसके बजाय, हम (>>=) और return की परिभाषा इनलाइन और संतुलन संबंधी तर्क के माध्यम से साबित होता है कि कानून रखती

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

तो हो सकता है, अंततः, इकाई कानून जब तक fst . split == id, which is doesn't धारण करने के लिए असफल प्रतीत होता है। और नहीं करना चाहिए।

लेकिन नैतिक रूप से, fst (split r)r जैसा ही है? खैर, जब तक हम परिचालन कर रहे हैं जैसे कि हम बीज मूल्य से अनजान हैं, हां, fst . split नैतिक रूप से id के बराबर है। Gen -as-a-function द्वारा उत्पादित वास्तविक मान अलग-अलग होंगे, लेकिन मानों का वितरण invariant है।

और यही दस्तावेज का जिक्र है। मोनैड कानूनों में हमारी समानता समान रूप से नहीं रखती है, बल्कि पर विचार करके केवल "नैतिक रूप से" a के मानों पर संभाव्यता वितरण होने के लिए।

संबंधित मुद्दे