मेरे पास कुछ पुराने हास्केल कोड हैं जिनमें क्विक चेक टेस्ट केस शामिल हैं। क्विक चेक के नए संस्करण (मैंने अभी 2.4.0.1 में अपग्रेड किया है) में Arbitrary Word8
और अन्य के लिए टाइप क्लास इंस्टेंस शामिल हैं। ये test.QuickCheck के पुराने 2.0.x संस्करणों में मौजूद नहीं थे। इसके विपरीत।आप पैकेज कोड द्वारा प्रदान किए गए हास्केल प्रकार वर्ग उदाहरणों को कैसे ओवरराइड करते हैं?
instance Arbitrary Word8 where
arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
(8, choose (0, 255))]
ऊपर कोड संकलन समय पर एक नकली उदाहरण घोषणा त्रुटि होती है:
जबकि सामान्य अर्थ में उपयोगी है, पैकेज के द्वारा उपलब्ध कराया Arbitrary Word8
जनरेटर एक मैं अपने परीक्षण सुइट के लिए उपयोग करना चाहते हैं नहीं है । मैं इस कोड को बाहर ले जा सकता हूं और डिफ़ॉल्ट जनरेटर के साथ प्राप्त कर सकता हूं लेकिन मैं इसे हल करने का उचित तरीका जानना चाहता हूं।
एक संभावित समाधान जिसे मैंने माना है (लेकिन परीक्षण नहीं किया गया है) newtype
का उपयोग कर Word8
को अलियासिंग कर रहा है। इससे पूरे स्रोत में कई बदलाव आएंगे, इसलिए मुझे उम्मीद है कि एक क्लीनर तरीका है।
संपादित करें: जैसा कि नीचे टिप्पणी में उल्लेख किया है, स्वीकार किए जाते हैं जवाब बहुत साफ है और लागू करने के लिए आसान था:
newtype EncodedByte = EncodedByte Word8
instance Arbitrary EncodedByte where
arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
(8, choose (0, 255))]
लोगों का एक बहुत इस समाधान बदसूरत विचार करने के लिए लग रहे हैं। लेकिन यदि आप मूल्यों के प्रतिनिधित्व से अधिक "डेटा प्रकार" का अर्थ देते हैं, तो मुझे यह पूरी तरह से उचित लगता है। उदाहरण के लिए, आप केवल 'वर्ड 8' के बारे में बात नहीं कर रहे हैं, आप 'कंट्रोलकोड' या उसके जैसा कुछ बात कर रहे हैं। – luqui
जो बहुत अच्छा काम किया। जैसा कि यह पता चला है कि उपनामों को किसी भी कैस्केडिंग परिवर्तन की आवश्यकता नहीं थी। मुझे बस "चुनने" के लिए एक अतिरिक्त "उदाहरण रैंडम कुछ नया टाइप" घोषणा प्रदान करने की आवश्यकता थी। –