2011-03-06 15 views
11

मैं QuickCheck संपत्ति लिखने की कोशिश कर रहा हूं जो इनपुट के रूप में एक या अधिक कार्य लेता है। इसे आसान बनाने के लिए, कि समारोह रचना की जाँच करने के लिए एक संपत्ति पर विचार लगातार समारोह आवेदन के बराबर है, और एक त्वरित और गंदा परीक्षण चालक:क्विक चेक गुणों में उपयोग किए गए शो-इन फ़ंक्शन

import Test.QuickCheck 

prop_composition :: (Int -> Int) -> (Int -> Int) -> Int -> Bool 
prop_composition f g x = (f . g) x == f (g x) 

main :: IO() 
main = quickCheck prop_composition 

दुर्भाग्य से, यह संकलन नहीं करता, क्योंकि एक के लिए आदानों संपत्ति Show तो लागू करने के लिए QuickCheck रिपोर्ट कर सकते हैं कि क्या आदानों विफलता का कारण बना की जरूरत है, लेकिन कार्यों के लिए कोई Show कार्यान्वयन नहीं है:

Test.hs:10:7: 
    No instance for (Show (Int -> Int)) 
     arising from a use of `quickCheck' at Test.hs:10:7-33 
    Possible fix: add an instance declaration for (Show (Int -> Int)) 
    In the expression: quickCheck prop_composition 
    In the definition of `main': main = quickCheck prop_composition 

मैं कार्यों के लिए Show की अपने ही do-कुछ भी नहीं उदाहरण के लेखन की कोशिश की है ...

instance Show (a -> b) where 
    show _ = "[func]" 

... जो संकलित, लेकिन -Wall के साथ एक चेतावनी से चलाता है ...

Test.hs:3:9: Warning: orphan instance: instance Show (a -> b) 

... जो बनाता है मुझे लगता है कि यह करने के लिए एक अधिक सही तरीका है।

मेरा आंत मुझे बताता है कि उत्तर Test.QuickCheck.Function मॉड्यूल में है, लेकिन यह अनियंत्रित है, और मैं केवल प्रकार के हस्ताक्षर को देखने से नहीं समझ सकता कि इसमें क्या कुछ है या इसका उपयोग कैसे किया जा सकता है।

उत्तर

10

आप सही हैं Test.QuickCheck.Function सही उत्तर है। तुम बस प्रकार परिवर्तित:

prop_composition  :: Fun Int Int -> Fun Int Int -> Int -> Bool 
prop_composition f g x = ((apply f) . (apply g)) x == (apply f) ((apply g) x) 
3

import Text.Show.Functions भी मूल हस्ताक्षर रखने के साथ इस्तेमाल किया जा सकता।

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