2012-09-17 3 views
7

मैं एक समारोह, rev, कि एक प्रकार तीन typeclasses में है कि के लिए कुछ मान देता है:कैसे (मेरे मामले में सकारात्मक) Quickcheck साथ संशोधक का उपयोग करने के

rev :: (Integral a, Show a, Read a) => a -> a 
rev = read . reverse . show 

मैं कुछ परीक्षण करना चाहते हैं Quickcheck के साथ इसके बारे में संपत्ति। हालांकि, मुझे इंटीग्रल प्रकारों के नकारात्मक मूल्यों का परीक्षण करने में कोई दिलचस्पी नहीं है क्योंकि मैं बेस लाइब्रेरी में Natural प्रकार की कमी के कारण Integer का उपयोग कर रहा हूं। तो मैंने सोचा कि, चलो उत्पन्न मूल्य के विपरीत ले जब उत्पन्न मूल्य नकारात्मक है और मुझे ठीक हो जाओगे:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n | n >= 0 = (rev.rev) n == n 
      | otherwise = let n' = -n in (rev.rev) n' == n' 

(संपत्ति का परीक्षण यहां महत्वपूर्ण नहीं है - विशेष रूप से इसके लिए नहीं रखता है बहुत बुनियादी मूल्य और मुझे इसके बारे में पता है, यह इस प्रश्न का विषय नहीं है)

तब मैं Positive संशोधक में भाग गया और सोचा कि हालांकि मेरा परीक्षण अब काम कर रहा था, लेकिन इसे लागू करना अच्छा होगा अच्छा रास्ता तो मैंने कोशिश की:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n = (rev.rev) n == n 

मुझे स्वीकार करना होगा कि यह संकलित होने पर मुझे आश्चर्य हुआ। लेकिन फिर एक त्रुटि जब परीक्षण चल रहा है पॉपअप:

*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1} 

तो मैंने सोचा, "MMK, इस Positive बात एक उदाहरण Read की घोषणा करनी चाहिए।" तो मैंने बस यही किया, लेकिन उदाहरण पहले से ही त्वरित जांच पुस्तकालय में घोषित किया गया है ऐसा लगता है क्योंकि ghci मुझ पर चिल्लाया।

और इस बिंदु पर मैं खो गया हूं, क्योंकि मुझे अच्छा दस्तावेज नहीं मिला है (यदि कोई है)।

कोई भी सूचक जो मुझे संशोधक समझने में मदद करता है और त्वरित जांच पुस्तकालय में अन्य अच्छी चीजों की सराहना करता है।

+5

कोई पार्स नहीं है क्योंकि 'rev (सकारात्मक {getPositive = 1})' पढ़ा जाता है "} 1 = evitisoPteg {evitisoP" '। –

उत्तर

17

इन संशोधकों का उपयोग करने का सामान्य तरीका उन पर पैटर्न मिलान करना है, उदा।

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id (Positive n) = (rev.rev) n == n 

इस तरह, n अंतर्निहित प्रकार होगा।

+0

ब्लाह भी कोशिश करने के लिए सोचा नहीं था। मुझे मूर्ख। धन्यवाद :) – m09

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