/ / इंटीजर * इंटीजर गुणा के परिणाम को डबल में कैसे परिवर्तित करें? - हैकेल, टाइप-रूपांतरण, टाइपक्लास, बीजगणित-डेटा-प्रकार

एक इंटीजर * इंटीजर गुणा के परिणाम को डबल में कैसे परिवर्तित करें? - हैकेल, टाइप-रूपांतरण, टाइपक्लास, बीजगणित-डेटा-प्रकार

मैं सिर्फ हास्केल सीख रहा हूं और अपना पहला रिकर्सिव एडीटी विकसित करना चाहता हूं।

मेरा डेटाटाइप Figure आयताकारों और मंडलियों, और विधि के मनमानी संयोजनों का प्रतिनिधित्व करने में सक्षम होना चाहिए area एक आकृति के कुल क्षेत्र की गणना करनी चाहिए (ओवरलैप को अनदेखा करना)।

समस्या यह है कि उदाहरण के लिए आयताकार, चौड़ाई और ऊंचाई हैं Integer, जबकि क्षेत्र का परिणाम होना चाहिए Double (या कम से कम एक फ्लोटिंग पॉइंट नंबर)।

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
| Circle { x :: Integer, y :: Integer, radius :: Integer}
| CombiFigure Figure Figure
deriving (Eq, Read, Show)

area :: Figure -> Double
area (Rect _ _ w h) = (w * h) -- Integer * Integer, does not work
area (Circle _ _ r) = (pi * r * r) -- (Floating a => a) * Integer * Integer, does not work
area (CombiFigure first second) = (area first) + (area second) -- Double * Double, works

क्या आप मुझे यह निर्देश दे सकते हैं कि इसे कैसे हल किया जाए? यह अनिवार्य नहीं है कि परिणाम है Double, लेकिन सर्कल क्षेत्र की गणना के लिए कुछ फ़्लोटिंग पॉइंट नंबर।

उत्तर:

जवाब के लिए 0 № 1

@ जीन-बैपटिस्ट यूनीस की टिप्पणी के लिए धन्यवाद, मैं इसका उपयोग करके इसे हल करने में सक्षम था fromIntegral तथा fromInteger मिल गया यहाँ:

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
| Circle { x :: Integer, y :: Integer, radius :: Integer}
| CombiFigure Figure Figure
deriving (Eq, Read, Show)

area :: Figure -> Double
area (Rect _ _ w h) = (fromIntegral w * fromIntegral h) -- Method 1: using fromIntegral
area (Circle _ _ r) = (pi * fromInteger r * fromInteger r) -- Method 2: using fromInteger
area (CombiFigure first second) = (area first) + (area second)