2009-09-19 9 views
12

मेरे पास एक प्रकार का वर्ग Atomic है, जो कुछ प्रकारों को रैपर मान (Atom) से परिवर्तित करने के लिए कार्यों को परिभाषित करता है। मैं एक क्विक चेक संपत्ति को परिभाषित करना चाहता हूं जो कहता है: "Atomic के सभी उदाहरणों के लिए, कोई भी मूल्य सुरक्षित रूप से संग्रहीत और पुनर्प्राप्त किया जा सकता है"। संपत्ति इस तरह दिखता है:कई प्रकार के खिलाफ QuickCheck गुणों का परीक्षण?

class Atomic a where 
    toAtom :: a -> Atom 
    fromAtom :: Atom -> Maybe a 

prop_AtomIdentity x = fromAtom (toAtom x) == Just x 

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

containerTests = 
    [ run (prop_AtomIdentity :: Bool -> Bool) 
    , run (prop_AtomIdentity :: Word8 -> Bool) 
    , run (prop_AtomIdentity :: String -> Bool) 
    {- etc -} ] 

मैं एक समारोह जो स्वचालित रूप से ऐसा होगा परिभाषित करने के लिए कोशिश कर रहा हूँ :

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult] 
forallAtoms x = 
    [ run (x :: Bool -> Bool) 
    , run (x :: Word8 -> Bool) 
    , run (x :: String -> Bool) 
    {- etc -} ] 

containerTests = forallAtoms prop_AtomIdentity 

लेकिन यह एक typecheck त्रुटि के साथ विफल:

Tests/Containers.hs:33:0: 
    Couldn't match expected type `Word8' against inferred type `String' 
    In the first argument of `run', namely `(x :: Word8 -> Bool)' 
    In the expression: run (x :: Word8 -> Bool) 
    In the expression: 
     [run (x :: Bool -> Bool), run (x :: Word8 -> Bool), 
     run (x :: String -> Bool)] 

वहाँ कई प्रकार के खिलाफ एक QC संपत्ति का परीक्षण करने के लिए एक बेहतर तरीका है? यदि नहीं, तो क्या काम करने के लिए काम किया जा सकता है या क्या यह सिस्टम सिस्टम द्वारा समर्थित नहीं है?

उत्तर

12

मैं अपने कोड अंधा शॉट संकलन नहीं कर सकते, तो ...:

एक प्रकार हस्ताक्षर के रूप में की कोशिश

forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult] 

। इसके लिए -XRankNTypes भाषा एक्सटेंशन की आवश्यकता है।

समस्या आपके पास, के रूप में मैं इसे देख, कि GHC पूरे समारोह क्षेत्र के लिए x :: (a -> Bool) में a के लिए सम्मिलित करने के लिए एक प्रकार खोजने की कोशिश करता है, लेकिन आप पहले से ही तीन अलग-अलग दे।

+0

विश्वास नहीं कर सकता कि यह इतना आसान था। धन्यवाद! –

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