में फॉरल के बारे में उलझन में 'दयालु' मैंने जीएचसी 8.0.1 में एक अनुक्रमित स्थिति में भाग लिया है जिसमें टाइप-इंडेक्स (?) जीएडीटी हैं, जहां प्रकार बनाम हस्ताक्षरों में पहल शुरू करने से विभिन्न प्रकार की जांच होती है व्यवहार।टाइप-इंडेक्स किए गए जीएडीटी
पर विचार करें निम्न डेटा प्रकारों:
{-# LANGUAGE TypeInType, GADTs, ExplicitForAll #-}
-- Same thing happens when we replace ExplicitForAll with ScopedTypeVariables
import Data.Kind
data F (k :: * -> *) where
data G :: F k -> * where
G :: G x
यह डेटा प्रकार ठीक संकलित करता है। हालांकि, अगर हम G
में x
के प्रकार को निर्दिष्ट करना चाहते हैं, तो हमें एक प्रकार की त्रुटि मिलती है।
data H :: F k -> * where
H :: forall k' (x :: F k'). H x
त्रुटि संदेश
• Kind variable ‘k’ is implicitly bound in datatype ‘H’, but does not appear as the kind of any of its type variables. Perhaps you meant to bind it (with TypeInType) explicitly somewhere? • In the data declaration for ‘H’
हम तरह हस्ताक्षर (साथ या निर्माता में forall
के बिना) के लिए forall
जोड़ देते हैं तो है, वहाँ कोई त्रुटि है।
data I :: forall k. F k -> * where
I :: I x
data J :: forall k. F k -> * where
J :: forall k' (x :: F k'). J x
क्या चल रहा है?
वास्तव में उत्कृष्ट पन। ए + – rampion
ऐसा लगता है कि पूर्व घोषित घोषणा के लिए 'एफ के' तय किया जाएगा, जबकि उत्तरार्द्ध विभिन्न प्रकारों पर अपनी घोषणा में 'एच' का उपयोग करने की अनुमति देता है। अर्थात। यह polykinded रिकर्सन की अनुमति देता है। अपरिवर्तनीय प्रकारों (जैसे एग्डा/कोक में) में "पैरामीटर बनाम सूचकांक" भेद के समान हो सकता है। – chi
ऐसा लगता है कि यह एक (हाल ही में तय) कंपाइलर बग हो सकता है। मैं आपके त्रुटि संदेश को "ghc-8.0.1" के साथ डुप्लिकेट कर सकता हूं लेकिन यह "ghc-8.0.1.20161117" के साथ ठीक से संकलित करता है, जो नवीनतम संस्करण "स्टैक" ने मेरे लिए इंस्टॉल करने का निर्णय लिया (और जो 8.0 के लिए रिलीज़ उम्मीदवार प्रतीत होता है .2)। –