मेरे पास एक प्रकार का वर्ग 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 संपत्ति का परीक्षण करने के लिए एक बेहतर तरीका है? यदि नहीं, तो क्या काम करने के लिए काम किया जा सकता है या क्या यह सिस्टम सिस्टम द्वारा समर्थित नहीं है?
विश्वास नहीं कर सकता कि यह इतना आसान था। धन्यवाद! –