के लिए संदिग्ध उदाहरण को हल करना मैं एक विशेष संख्यात्मक डेटा प्रोसेसिंग लाइब्रेरी विकसित कर रहा हूं, और मुझे एक त्रुटि मिली है जिसे मैं ठीक नहीं कर सकता। मुझे लगता है कि पहले एक उदाहरण दिखाना आसान होगा और फिर मेरी समस्या को समझाएं। मैं अजीब नामों के लिए भी माफी माँगता हूं, मुझे कानूनी उद्देश्यों के लिए परेशान होना पड़ रहा है।मल्टीपार्म प्रकार वर्ग
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
data MyError = MyError String deriving (Eq, Show)
data MyList = MyList [Double] deriving (Eq, Show)
data NamedList = NamedList String MyList deriving (Eq, Show)
class MyNum a b ret where
myAdd :: a -> b -> Either MyError ret
myLessThan :: a -> b -> Either MyError Bool
instance MyNum MyList Double MyList where
myAdd (MyList xs) x = Right $ MyList $ map (+x) xs
myLessThan (MyList xs) x = Right $ all (< x) xs
instance MyNum NamedList Double NamedList where
myAdd (NamedList n l) x = fmap (NamedList n) $ myAdd l x
myLessThan (NamedList n l) x = myLessThan l x
यदि मैं यह संकलित करने के लिए प्रयास करते हैं, मैं त्रुटि
No instance for (MyNum MyList Double ret0)
arising from a use of `myLessThan'
The type variable `ret0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there is a potential instance available:
instance MyNum MyList Double MyList
-- Defined at testing_instances.hs:13:10
Possible fix:
add an instance declaration for (MyNum MyList Double ret0)
In the expression: myLessThan l x
In an equation for `myLessThan':
myLessThan (NamedList n l) x = myLessThan l x
In the instance declaration for `MyNum NamedList Double NamedList'
मिलता क्योंकि संकलक को समझ नहीं सकता जो MyNum
का विशिष्ट उदाहरण MyList
के लिए उपयोग करने के लिए। यह myAdd
के लिए काम करता है क्योंकि MyNum
के लिए वापसी प्रकार आसानी से प्राप्त किया गया है, लेकिन यह myLessThan
के लिए इसे समझ नहीं सकता है। मैं इस टाइपक्लास का उपयोग करना चाहता हूं ताकि मैं आसानी से ठीक से जुड़ा हुआ त्रुटि संभाल सकूं, और क्योंकि मेरा वास्तविक कोड +, -, *,/<, < =,>, और> =, और मैं चाहता हूं MyNum Double MyList MyList
, MyNum MyList MyList MyList
, और NamedList
के लिए समान उदाहरण के लिए एक उदाहरण बनाने के लिए। जब तक ऐसा करने का कोई आसान तरीका न हो, ऐसा इसलिए है कि मेरे पास पॉलिमॉर्फिक कम्यूटेटिव ऑपरेटर हो सकते हैं।
हालांकि, मैं यह नहीं समझ सकता कि दूसरे उदाहरण के लिए myLessThan
में किस प्रकार का हस्ताक्षर जोड़ना है ताकि यह पता चल सके कि किस उदाहरण का उपयोग करना है। मुझे पता है कि अंकगणित और तुलना ऑपरेटर को दो अलग-अलग प्रकार के वर्गों में विभाजित करना एक समाधान होगा, लेकिन यदि संभव हो तो मैं ऐसा करने से बचाना चाहूंगा।
यह मेरे लिए हास्केल में एक पूर्व अपरिचित निर्माण है, और वास्तव में मुझे जो चाहिए, धन्यवाद! – bheklilr
@bheklilr खुश मैं मदद कर सकता था। आप टाइपफमिलियों के बारे में भी जानना चाहेंगे, जो कि कुछ तरीकों से और अधिक शक्तिशाली काम करना आसान है। – jberryman