आपकी समझ सही नहीं है। समस्या का एक बड़ा हिस्सा यह है कि आपके द्वारा उपयोग किए जाने वाले पारंपरिक अस्तित्व मात्रात्मक वाक्यविन्यास किसी भी व्यक्ति के लिए बहुत भ्रमित है जो इससे पूरी तरह से परिचित नहीं है। इसलिए मैं दृढ़ता से अनुशंसा करता हूं कि आप इसके बजाय जीएडीटी वाक्यविन्यास का उपयोग करें, जिसका सख्ती से अधिक शक्तिशाली होने का लाभ भी है। करने के लिए आसान बात सिर्फ {-# LANGUAGE GADTs #-}
सक्षम करने के लिए है। जबकि हम इसमें हैं, चलो {-# LANGUAGE ScopedTypeVariables #-}
चालू करें, क्योंकि मुझे किसी भी स्थान पर forall
का अर्थ है।
data V where
V :: Show a => a -> V
तो V
डेटा निर्माता एक समारोह है कि किसी भी showable के बारे में कुछ लेता है: अपने V
परिभाषा हम वास्तव में स्पष्ट forall
छोड़ अगर हम चाहते कर सकते हैं के रूप में
data V where
V :: forall a . Show a => a -> V
बिल्कुल वही बात का मतलब V
टाइप करें और टाइप करें। map
के प्रकार के बहुत प्रतिबंधक है:
map :: (a -> b) -> [a] -> [b]
सभी सूची के तत्वों map
के लिए पारित एक ही प्रकार करना होगा।
[1, "a"] :: [forall a. Show a => a]
अब क्या यह वास्तव में कहना है कि [1, "a"]
एक सूची, में से प्रत्येक जिसका तत्व है टाइप forall a . Show a => a
है: तो map V
के प्रकार के सिर्फ
map V :: Show a => [a] -> [V]
चलो अब अपनी पहली अभिव्यक्ति करने के लिए वापस पाने के लिए है। यही है, अगर मैं a
प्रदान करता हूं जो Show
का उदाहरण है, तो सूची के प्रत्येक तत्व में उस प्रकार का होना चाहिए। यह बिल्कुल सही नहीं है। "a"
उदाहरण के लिए, Bool
टाइप करें। यहां एक और समस्या है; प्रकार [forall a . Show a => a]
"अपमानजनक" है। मुझे इसका अर्थ क्या है, इसका विवरण समझ में नहीं आता है, लेकिन ->
के अलावा किसी प्रकार के कन्स्ट्रक्टर के तर्क में आप forall
फंस गए हैं, और इसकी अनुमति नहीं है। जीएचसी सुझाव दे सकता है कि आप ImpredicativeTypes
एक्सटेंशन सक्षम करें, लेकिन यह वास्तव में सही काम नहीं करता है, इसलिए आपको नहीं करना चाहिए। यदि आप अस्तित्व में प्रमाणित चीजों की एक सूची चाहते हैं, तो आपको उन्हें पहले अस्तित्व में डेटाटाइप में लपेटना होगा या एक विशेष अस्तित्व सूची सूची का उपयोग करना होगा। यदि आप सार्वभौमिक रूप से मात्राबद्ध चीजों की एक सूची चाहते हैं, तो आपको उन्हें पहले लपेटने की आवश्यकता है (शायद नए प्रकार में)।
यह हमेशा मुझे खराब कर देता है। मुझे उस से नफरत है '[शो 1, शो "ए"]' और 'मैप शो [1, "ए"]' वही नहीं हैं। –