2011-04-13 20 views
8

मेरे पास कुछ पुराने हास्केल कोड हैं जिनमें क्विक चेक टेस्ट केस शामिल हैं। क्विक चेक के नए संस्करण (मैंने अभी 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))] 

उत्तर

7

एक newtype उर्फ ​​यहाँ मानकों समाधान है। ज्यादातर मामलों में, जिसमें आपका शामिल नहीं हो सकता है, यह एक बड़ा सौदा नहीं है क्योंकि न्यूटाइप रैपर को केवल उस स्थान पर दिखने की आवश्यकता है जहां आप मनमानी टाइपक्लास का उपयोग करते हैं। उदाहरण के लिए, यदि आप कुछ शीर्ष स्तर पर हो सकता है:

x <- arbitrary 

और बजाय आप होगा

newtype SomeNewType = SNT Word8 
instance Arbitrary SomeNewType where ... 
.... 
    SNT x <- arbitrary 

क्या आप शायद चाहते हैं एक GHC विस्तार के रूप में मौजूद नहीं है - आप स्पष्ट आयात और निर्यात चाहते हैं उदाहरणों के आप स्पष्ट उदाहरण आयात किया था अगर यह अनुमति होगी:

import Test.QuickCheck hiding (Arbitrary(Word8)) 

लेकिन कोड है कि वर्तमान में उदाहरणों में से निहित आयात से काम करता है की बहुत सारी तोड़ने:

import Test.QuickCheck (quickCheck) -- note the implicit import of Arbitrary(..) 
+4

लोगों का एक बहुत इस समाधान बदसूरत विचार करने के लिए लग रहे हैं। लेकिन यदि आप मूल्यों के प्रतिनिधित्व से अधिक "डेटा प्रकार" का अर्थ देते हैं, तो मुझे यह पूरी तरह से उचित लगता है। उदाहरण के लिए, आप केवल 'वर्ड 8' के बारे में बात नहीं कर रहे हैं, आप 'कंट्रोलकोड' या उसके जैसा कुछ बात कर रहे हैं। – luqui

+0

जो बहुत अच्छा काम किया। जैसा कि यह पता चला है कि उपनामों को किसी भी कैस्केडिंग परिवर्तन की आवश्यकता नहीं थी। मुझे बस "चुनने" के लिए एक अतिरिक्त "उदाहरण रैंडम कुछ नया टाइप" घोषणा प्रदान करने की आवश्यकता थी। –

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

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