पर विचार करें:टाइपक्लास उदाहरणों के वर्गबद्ध विस्फोट से कैसे बचें?
{-# OPTIONS -fglasgow-exts #-}
data Second = Second
data Minute = Minute
data Hour = Hour
-- Look Ma', a phantom type!
data Time a = Time Int
instance Show (Time Second) where
show (Time t) = show t ++ "sec"
instance Show (Time Minute) where
show (Time t) = show t ++ "min"
instance Show (Time Hour) where
show (Time t) = show t ++ "hrs"
sec :: Int -> Time Second
sec t = Time t
minute :: Int -> Time Minute
minute t = Time t
hour :: Int -> Time Hour
hour t = Time t
class TimeAdder a b c | a b -> c where
add :: Time a -> Time b -> Time c
instance TimeAdder Second Second Second where
add (Time s1) (Time s2) = sec (s1 + s2)
instance TimeAdder Second Minute Second where
add (Time s) (Time m) = sec (s + 60*m)
instance TimeAdder Second Hour Second where
add (Time s) (Time h) = sec (s + 3600*h)
instance TimeAdder Minute Second Second where
add (Time m) (Time s) = sec (60*m + s)
instance TimeAdder Minute Minute Minute where
add (Time m1) (Time m2) = minute (m1 + m2)
instance TimeAdder Minute Hour Minute where
add (Time m) (Time h) = minute (m + 60*h)
instance TimeAdder Hour Second Second where
add (Time h) (Time s) = sec (3600*h + s)
instance TimeAdder Hour Minute Minute where
add (Time h) (Time m) = minute (60*h + m)
instance TimeAdder Hour Hour Hour where
add (Time h1) (Time h2) = hour (h1 + h2)
add (minute 5) (hour 2)
--125min
हालांकि मैं काफी रोमांचित है कि इस तरह पागल सामान काम करता हूँ, मुझे आश्चर्य है कि कैसे TimeAdder
उदाहरणों में से द्विघात विस्फोट से बचा जा सकता।
घंटे, मिनट और सेकंड वास्तव में उस प्रकार सुरक्षा के इस प्रकार के लिए एक उम्मीदवार के अच्छा नहीं कर रहे हैं, के बाद से क्यों आप कभी भी है कि जैसे एक समारोह के लिए होता है केवल सेकंड में समय स्वीकार करता है? इस प्रकार की प्रकार-सुरक्षा के लिए एक बेहतर अभ्यास उदाहरण के लिए, भौतिक इकाइयां हो सकती हैं। आप 'टाइम',' मास ',' लम्बाई 'आदि को प्रेत प्रकार के रूप में कह सकते हैं और गति, ऊर्जा इत्यादि के लिए टाइप-सुरक्षित गणनाएं कर सकते हैं। इससे उदाहरणों की संख्या में भी मदद मिलेगी क्योंकि सभी प्रकारों में अंतर-परिवर्तनीय नहीं है आपका समय उदाहरण – shang
@shang: यह सही है। मुझे यह उल्लेख करना चाहिए था कि टाइप क्लास और प्रेत प्रकारों पर बेहतर संभाल पाने के लिए यह सिर्फ एक खिलौना उदाहरण है। मैं समझता हूं कि वास्तविक इकाइयों के लिए समय इकाइयों के साथ केवल हथौड़ा का पहला जवाब अधिक व्यावहारिक होगा। – Landei