में एक डबल के साथ एक परिसर डबल गुणा मैं जब निम्नलिखित कोड संकलन नहीं होगा थोड़ा हैरान था:हास्केल
-- Code 1
import Complex
type Velocity = Complex Double
type Force = Complex Double
type FrictionCoeff = Double
frictionForce :: FrictionCoeff -> Velocity -> Force
frictionForce mu vel = mu * vel
त्रुटि का कहना है
Couldn't match expected type `Complex Double'
with actual type `Double'
Expected type: Force
Actual type: FrictionCoeff
In the first argument of `(*)', namely `mu'
In the expression: mu * vel
तो, कम
में-- Code 2
let z = 1 :+ 2
z * 3 -- Goes fine.
z * 2.5 -- Goes fine.
z * (2.5 :: Double) -- Explodes.
कॉम्प्लेक्स परिभाषित करता है (*)
instance (RealFloat a) => Num (Complex a) where
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
क्यों 3 (न्यू ए => ए) और 2.5 (फ्रैक्शनल ए => ए) पैटर्न के साथ मिलान किया जा सकता है (x: + y), लेकिन एक डबल नहीं कर सकता है?
ध्यान दें कि इसका पैटर्न मिलान के साथ कुछ लेना देना नहीं है। * एकीकरण * सही शब्द हो सकता है। आप कह सकते हैं कि 'Num a => a'' जटिल डबल 'के साथ अपरिहार्य है, लेकिन' डबल' नहीं है। – Rotsor
वैसे भी जटिल वेगों के साथ आप क्या कर रहे हैं? ऐसा कुछ ऐसा लगता है जो वास्तव में एक वेक्टर होना चाहिए। – leftaroundabout
परिसर अंतर्निहित हैं और चरण, परिमाण और सभी को प्राप्त करने के लिए बहुत ही आसान कार्यों के साथ आते हैं। मुझे पहिया का पुन: आविष्कार करने की तरह महसूस नहीं होता है। क्या 2 डी वैक्टर के लिए एक लाइब्रेरी है जिसका मैं उपयोग कर सकता हूं? – Niriel