7

में तरह निर्दिष्ट करने इस घोषणाहास्केल - डेटा घोषणा

data Const a = Const Integer 

हास्केल infers कि Const* -> * है। क्या Const इसके बजाय एक प्रकार का कन्स्ट्रक्टर लेना संभव है, तो यह (* -> *) -> * होगा? आदर्श रूप से, यह a -> * होना चाहिए, लेकिन कोई बहुलक प्रकार नहीं हैं। This thread एक समाधान दिखाता है - अप्रयुक्त कन्स्ट्रक्टर जोड़ना। 2002 से स्थिति बदल गई है?

उत्तर

13

आप सही हैं, क्योंकि जीएचसी पॉलिमॉर्फिक प्रकार का समर्थन नहीं करता है, यह * पर तरह से डिफॉल्ट होगा।

हालांकि, KindSignatures एक्सटेंशन का उपयोग कर, आप स्पष्ट रूप से एक डेटा घोषणा एक विशेष प्रकार के साथ उनकी व्याख्या कर सकते हैं:

{-# LANGUAGE KindSignatures #-} 

data Const (a :: * -> *) = Const Integer 

या, यदि GADT एस के अपने एक प्रशंसक:

{-# LANGUAGE GADTs #-} 

data Const :: (* -> *) -> * where 
    Const :: Integer -> Const a 

अब आप कर सकते हैं लिखें:

x :: Const Maybe 
x = Const 2 

मैंने अभी मूल प्रोग्राम को प्रयोगात्मक Utrecht Haskell Compiler (यूएचसी) के साथ संकलित किया है।

यूएचसी वास्तव में किसी वास्तविक दुनिया के कार्यक्रमों को संकलित नहीं करता है, लेकिन यह दयालु बहुरूपता का समर्थन करता है! इसे देखने के लिए इसकी पूर्णांक:

-- kind of data type: 
Const :: forall a . a -> * 

-- type of constructor: 
Const :: Integer -> forall* a . forall b(a) . Const b 
संबंधित मुद्दे