मैं की तरहQuickCheck: exhaustiveness चेकर का उपयोग कैसे करें राशि प्रकार
data Mytype
= C1
| C2 Char
| C3 Int String
अगर मैं case
एक Mytype
पर एक हास्केल डेटा प्रकार है और मामलों में से एक को संभालने के लिए भूल जाते हैं की भूल कंस्ट्रक्टर्स को रोकने के लिए, GHC मुझे देता है एक चेतावनी (निकास जांच)।
मैं अब MyTypes
तरह उत्पन्न करने के लिए एक QuickCheck Arbitrary
उदाहरण लिखना चाहते हैं:
instance Arbitrary Mytype where
arbitrary = do
n <- choose (1, 3 :: Int)
case n of
1 -> C1
2 -> C2 <$> arbitrary
3 -> C3 <$> arbitrary <*> someCustomGen
इस के साथ समस्या यह है कि मैं Mytype
एक नया विकल्प जोड़ने के लिए और मनमानी उदाहरण अद्यतन करने के लिए, इस प्रकार के होने भूल सकता है मेरी परीक्षण उस विकल्प का परीक्षण नहीं करते हैं।
मैं अपने मनमानी उदाहरण में भूल गए मामलों को याद दिलाने के लिए जीएचसी के थकाऊ चेकर का उपयोग करने का एक तरीका ढूंढना चाहता हूं।
सबसे अच्छा मैं ले कर आए हैं
arbitrary = do
x <- elements [C1, C2 undefined, C3 undefined undefined]
case x of
C1 -> C1
C2 _ -> C2 <$> arbitrary
C3 _ _ -> C3 <$> arbitrary <*> someCustomGen
है लेकिन यह वास्तव में सुंदर महसूस नहीं करता है।
मुझे सहजता से लगता है कि इसमें कोई 100% साफ समाधान नहीं है, लेकिन ऐसे मामलों की भूल करने की संभावना कम हो जाएगी - विशेष रूप से एक बड़ी परियोजना में जहां कोड और परीक्षण अलग हो जाते हैं।
बस एक नोट: एक लिख सकते हैं 'सी 2 {}' 'सी 2 के बजाय _' और इतने जिस पर कम से कम एक सा वाक्य रचना अच्छे बनाता है। – nh2
ध्यान दें कि कन्स्ट्रक्टर सख्त होने पर 'अपरिभाषित' चीज़ विफल हो जाएगी। –
क्या कोई कारण है कि आप केवल टी के साथ मनमाना उदाहरण प्राप्त नहीं करना चाहते हैं? –