मेरे पास 3 डी वेक्टर डेटा प्रकार 3 फ्लोट्स के रूप में परिभाषित किया गया है। मैं समझता हूं कि अगर मैं अपनी कक्षा के लिए Num
उदाहरण प्रदान करता हूं और सामान्य गणितीय ऑपरेटरों को परिभाषित करता हूं, तो मैं उन्हें अपनी कक्षा में उपयोग कर सकता हूं।क्यों राशि को GHC.Num.fromInteger की आवश्यकता है?
data Vec3 = Vec3 { x :: Float
, y :: Float
, z :: Float
} deriving (Show, Eq)
instance Num Vec3 where
(+) v1 v2 = Vec3 (x v1 + x v2) (y v1 + y v2) (z v1 + z v2)
जब मैं GHCi में मेरी फाइल को लोड, मैं चेतावनी मिल क्योंकि मैं Num
में सभी कार्यों को परिभाषित नहीं किया है, जो समझ में आता है।
Prelude> :l temp.hs
[1 of 1] Compiling Main (temp.hs, interpreted)
temp.hs:6:10: Warning:
No explicit method or default declaration for `*'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `abs'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `signum'
In the instance declaration for `Num Vec3'
temp.hs:6:10: Warning:
No explicit method or default declaration for `fromInteger'
In the instance declaration for `Num Vec3'
Ok, modules loaded: Main.
हालांकि, मैं अभी भी उन लोगों का उपयोग कर सकता हूं जिन्हें मैंने परिभाषित किया है।
*Main> let a = Vec3 1.0 2.0 3.0
*Main> let b = Vec3 2.0 4.0 5.0
*Main> a + b
Vec3 {x = 3.0, y = 6.0, z = 8.0}
मेरे भ्रम जब योग समारोह
*Main> sum [a,b]
Vec3 {x = *** Exception: temp.hs:6:10-17: No instance nor default method for class operation GHC.Num.fromInteger
उपयोग करने के लिए क्यों योग मेरी Vec3
डेटा प्रकार के लिए एक fromInteger
परिभाषा की जरूरत है की कोशिश कर निम्न त्रुटि मैं से आता है? एक के लिए, मुझे लगता होगा कि योग केवल +
फ़ंक्शन का उपयोग करता है, और दूसरे के लिए, मेरा डेटा प्रकार Integer
का उपयोग नहीं करता है।
आपको कक्षा के उदाहरण के रूप में डेटा प्रकार पर विचार करने से पहले हमेशा ** सभी ** संचालन को न्यूनतम पूर्ण परिभाषा में परिभाषित करना चाहिए ... – Bakuriu
वास्तविक समस्या यह है कि आप 'Vec3' को 'Num'' का उदाहरण बना रहे हैं, भले ही वेक्टर संख्याएं न हों। – rightfold
@ राइटफोल्ड पर विस्तार करने के लिए - नम के कुछ उदाहरण न दें क्योंकि आप चाहते हैं + - वेक्टर संख्याएं नहीं हैं, भले ही आप ऑपरेटरों में से कुछ ऑपरेटरों को संख्या ऑपरेटर के समान नाम दें। (यद्यपि आप 'वेक्टर' द्वारा संख्याओं के रूप में वेक्टरों के रूप में _can_ का इलाज करते हैं, तो आप केवल ज्यामितीय या भौतिक भावना में वेक्टर के बजाय 'संख्याओं का निश्चित आकार संग्रह' का मतलब रखते हैं)। – Cubic