13

मेरी (हो सकता है गलत) समझ में, दो सूचियों निम्नलिखित बराबर होना चाहिए:क्यों '[1, "ए"] :: [फोरल ए। एक => ए] दिखाएं 'की अनुमति नहीं है?

[1, "a"] :: [forall a. Show a => a] 

data V = forall a. Show a => V a 
[V 1, V "a"] :: [V] 

हालांकि, पहले एक स्वीकार नहीं किया है, लेकिन एक दूसरे के ठीक काम करता है (ExistentialQuantification के साथ)।

यदि पहली सूची मौजूद नहीं है, तो map V :: ??? -> [V] के रिक्त स्थान में क्या प्रकार होगा? किस प्रकार की तंत्र रैपर के अस्तित्व को लागू करती है?

+0

यह हमेशा मुझे खराब कर देता है। मुझे उस से नफरत है '[शो 1, शो "ए"]' और 'मैप शो [1, "ए"]' वही नहीं हैं। –

उत्तर

13

आपकी समझ सही नहीं है। समस्या का एक बड़ा हिस्सा यह है कि आपके द्वारा उपयोग किए जाने वाले पारंपरिक अस्तित्व मात्रात्मक वाक्यविन्यास किसी भी व्यक्ति के लिए बहुत भ्रमित है जो इससे पूरी तरह से परिचित नहीं है। इसलिए मैं दृढ़ता से अनुशंसा करता हूं कि आप इसके बजाय जीएडीटी वाक्यविन्यास का उपयोग करें, जिसका सख्ती से अधिक शक्तिशाली होने का लाभ भी है। करने के लिए आसान बात सिर्फ {-# 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 एक्सटेंशन सक्षम करें, लेकिन यह वास्तव में सही काम नहीं करता है, इसलिए आपको नहीं करना चाहिए। यदि आप अस्तित्व में प्रमाणित चीजों की एक सूची चाहते हैं, तो आपको उन्हें पहले अस्तित्व में डेटाटाइप में लपेटना होगा या एक विशेष अस्तित्व सूची सूची का उपयोग करना होगा। यदि आप सार्वभौमिक रूप से मात्राबद्ध चीजों की एक सूची चाहते हैं, तो आपको उन्हें पहले लपेटने की आवश्यकता है (शायद नए प्रकार में)।

संबंधित मुद्दे