के खूनी बनें। हमें सबकुछ मापना होगा और मात्रा का डोमेन देना होगा। मानों के प्रकार हैं; प्रकार के स्तर की चीजें हैं; BOX
में रहते हैं।
f1 :: forall (k :: BOX).
(forall (a :: k) (m :: k -> *). m a -> Int)
-> Int
f2 :: (forall (k :: BOX) (a :: k) (m :: k -> *). m a -> Int)
-> Int
अब, न तो उदाहरण के प्रकार में k
स्पष्ट रूप से मात्रा निर्धारित किया है, तो GHC चाहे और जहां k
उल्लेख किया गया है के आधार पर जहां कि forall (k :: BOX)
डाल करने के लिए यह तय करना है, है। मुझे पूरी तरह से यकीन नहीं है कि मैं समझता हूं या नीति के बचाव के लिए तैयार हूं।
Ørjan अभ्यास में अंतर का एक अच्छा उदाहरण देता है। चलो इसके बारे में भी खूनी हो। संबंधित अनुप्रयोग के लिए forall
और f @ type
से संबंधित अमूर्तता को स्पष्ट करने के लिए मैं /\ (a :: k). t
लिखूंगा। गेम यह है कि हमें @
-ed तर्क चुनने के लिए मिलता है, लेकिन हमें शैतान चुनने वाले तर्कों के साथ /\
-ed तर्कों को तैयार करने के लिए तैयार रहना होगा।
हम
x :: forall (a :: *) (m :: * -> *). m a -> Int
है और उसके अनुसार पता लग सकता है कि f1 x
वास्तव में
f1 @ * (/\ (a :: *) (m :: * -> *). x @ a @ m)
है हालांकि, अगर हम f2 x
एक ही इलाज देने की कोशिश, हम देखते हैं
f2 (/\ (k :: BOX) (a :: k) (m :: k -> *). x @ ?m0 @ ?a0)
?m0 :: *
?a0 :: * -> *
where m a = m0 a0
हास्केल टाइप सिस्टम पूरी तरह सिंटैक्टिक के रूप में टाइप एप्लिकेशन का इलाज करता है, इसलिए एक ही रास्ता है कि समीकरण हल किया जा सकता, कार्यों की पहचान करने और तर्क
(?m0 :: * -> *) = (m :: k -> *)
(?a0 :: *) = (a :: k)
लेकिन उन समीकरणों भी अच्छी तरह से kinded नहीं कर रहे हैं की पहचान करके है, क्योंकि k
चुना जाना करने के लिए स्वतंत्र नहीं है: यह /\
@
नहीं एड किया जा रहा है -ईडी।
आम तौर पर, इन उबेर-पॉलिमॉर्फिक प्रकारों के साथ पकड़ने के लिए, सभी क्वांटिफ़ायर लिखना अच्छा होता है और फिर पता चलता है कि यह शैतान के खिलाफ आपके गेम में कैसे बदल जाता है। कौन चुनता है, और किस क्रम में। एक तर्क प्रकार के अंदर forall
को स्थानांतरित करने से इसके चयनकर्ता बदल जाते हैं, और अक्सर जीत और हार के बीच अंतर बना सकते हैं।
वहां 'के' वास्तव में क्या है? 'के' वैरिएबल' * 'जैसी कोई विशेष चीज़ है? – Sibi
@ सिबी 'के' एक प्रकार का चर है,' * 'इसके संभावित" मानों में से एक है "। हास्केल प्रकारों में वैल्यू के प्रकारों के समान प्रकार होते हैं, हालांकि आपको बिल्टिन निश्चित प्रकारों जैसे '*' और '* -> *' से अधिक उपयोग करने के लिए एक्सटेंशन की आवश्यकता होती है। –