कोड के इस विशेष भाग का उद्देश्य को elems
में सभी तत्वों की गणना करने से अधिक प्रभावी बनाना है। मैंने सूची बनाने वाले दो प्रकारों को संक्षेप में सुलझा लिया है, लेकिन मैं आकार फ़ंक्शन के हस्ताक्षर को प्रतीत नहीं कर सकता।आप "या तो ए" के प्रकार से कैसे मेल खाते हैं?
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
प्रीलूड से, हम जानते हैं कि Either a b = Left a | Right b
।
पहली बात मैंने कोशिश की थी Either
से मेल खाना था, लेकिन निश्चित रूप से यह एक प्रकार है, इसलिए यह काम नहीं करता है। इसके बाद, मैंने ((Left a) | (Right b))
की कोशिश की, लेकिन उस पर कोई भी नहीं। Either a b
टाइप करने के लिए कुछ और नहीं लगता है।
मैं संकलित करने के लिए size (Left a)
प्राप्त करने में सक्षम था, लेकिन बाद से यह b
घटक गुम है, तो मैं त्रुटि प्राप्त:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
जो पाठ्यक्रम के संदर्भ में समझ में आता है, लेकिन मैं वास्तव में कोई सुराग नहीं कैसे करने के लिए है मैच Either a b
।
किसी के पास कोई विचार है?
आप एक प्रकार और एक कन्स्ट्रक्टर के बीच के अंतर के बारे में थोड़ा उलझन में लगते हैं। "या तो एक बी" एक प्रकार है जिसमें दो रचनाकार, "बाएं" और "दाएं" हैं। प्रकार प्रकार हस्ताक्षर में जाते हैं, जबकि रचनाकार कोड में जाते हैं। यह एक आम भ्रम है क्योंकि बहुत से प्रकार टाइप और कन्स्ट्रक्टर के लिए समान नाम का उपयोग करते हैं, जैसा कि "डेटा Foo = Foo Int String" में है; पहला "फू" प्रकार है, जबकि दूसरा कन्स्ट्रक्टर है। –