मैं वर्तमान में Learn you a Haskell में हूं, और मैं Functor
टाइपक्लास पर अनुभाग तक पहुंच गया हूं। कहा गया अनुभाग में लेखक इस उदाहरण के उदाहरण देता है कि कक्षा के उदाहरणों को कैसे अलग किया जा सकता है (उदाहरण के लिए Maybe
, एक कस्टम Tree
प्रकार इत्यादि) इसे देखकर, मैंने निर्णय लिया (मज़ेदार और अभ्यास के लिए) Data.Set
प्रकार के लिए एक उदाहरण लागू करने का प्रयास करें ; इस सब में, Data.Set.map
को अनदेखा कर रहा है। ,किसी वर्ग के उदाहरण में क्लास बाधा को कैसे प्रभावित करता है जिसके लिए एक ठोस प्रकार के बजाय एक प्रकार का कन्स्ट्रक्टर की आवश्यकता होती है?
instance Functor Set.Set where
fmap f empty = Set.empty
fmap f s = Set.fromList $ map f (Set.elems s)
लेकिन चूंकि मैं समारोह fromList
इस में इस्तेमाल किया प्रकार के लिए बुला एक वर्ग बाधा में लाता है का उपयोग करने के होती हैं:
वास्तविक उदाहरण ही सुंदर सीधी-सपाट है, और मैं के रूप में यह लिखा था Set
, Ord
होने के लिए के रूप में एक संकलक त्रुटि द्वारा समझाया गया है:
Error occurred
ERROR line 4 - Cannot justify constraints in instance member binding
*** Expression : fmap
*** Type : Functor Set => (a -> b) -> Set a -> Set b
*** Given context : Functor Set
*** Constraints : Ord b
देखें: Live Example
मैं त्रि उदाहरण पर एक बाधा डालना, या fmap
पर एक प्रकार का हस्ताक्षर जोड़ना, लेकिन न तो सफल हुआ (दोनों संकलक त्रुटियां भी थीं।)
इस तरह की स्थिति को देखते हुए, एक बाधा कैसे पूरी हो सकती है और संतुष्ट हो सकती है? क्या कोई संभावित तरीका है?
अग्रिम धन्यवाद! :)
एक कंस्ट्रेन्ड functor वर्गों के साथ समस्या यह है कि हम सत्ता का एक बहुत खो देते हैं। विशेष रूप से आवेदक functors के साथ, हम अक्सर उन कार्यों में रखना चाहते हैं। हालांकि, कई मामलों में उन वर्गों के सामान्य उदाहरण प्रदान करना असंभव है जिन्हें हम कार्यों में रुचि रखते हैं। – hammar