2015-08-21 4 views
5

हास्केल ट्यूटोरियल मैं पढ़ रहा हूँ एक अनुभाग प्रकार kinds की मूल बातें शुरू करने की है, और तरहमेरे प्रकार के प्रकार के अंत में '-> बाधा' क्यों है?

* -> (* -> *) -> * 

मैं समझता हूँ कि होने के रूप में एक प्रकार वर्ग

class Tofu t where 
    tofu :: j a -> t a j 

का वर्णन करता है, लेकिन जब मैं में प्रवेश :k Tofu GHCi में, मैं

Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint 

GHC.Prim.Constraint क्या है और क्यों की तरह करता है Tofu इस उत्पाद को * -> (* -> *) -> * के बजाय यह फ़ॉर्म है?

उत्तर

6

t तरह * -> (* -> *) -> * के वर्ग Tofu का एक प्रकार पैरामीटर (t :: * -> (* -> *) -> * लिखित) है। यह जीएचसी द्वारा t का अनुमानित प्रकार है क्योंकि -XPolyKinds की अनुपस्थिति में, जीएचसी * को सभी प्रकार के पैरामीटर को डिफॉल्ट करने का प्रयास करता है। इस प्रकार जीएचसी मानता है a दयालु * है (हालांकि आपके हस्ताक्षर में कुछ भी यह एकमात्र विकल्प नहीं बनाता है)।

प्रकार निर्माता (->)तरह* -> * -> * है। चूंकि j a(->) पर पैरामीटर के रूप में प्रकट होता है, j a में * होना चाहिए। चूंकि जीएचसी ने माना है कि a में * है, j एक प्रकार है जो * का प्रकार लेता है और * की तरह कुछ देता है। इस प्रकार:

j :: * -> * 

t के बाद से a और j दोनों पर लागू होता है, t पहला तर्क a तरह * है और दूसरा तर्क j तरह *->* है क्योंकि, तरह * -> (* -> *) -> * है, और कुल मिलाकर प्रकार t a jचाहिए* टाइप करें क्योंकि यह (->) प्रकार का पैरामीटर भी है।

कक्षाएं सिर्फ प्रकार पैरामीटर लेने (बस data Foo a b की तरह) प्रकार के होते हैं, Foo a b सिवाय तरह * जबकि Tofu t तरह एक विशेष प्रकार का Constraint है। इस प्रकार Tofu की तरह है:

(* -> (* -> *) -> *) -> Constraint 

GHC इंगित करता है के रूप में। Constraint केवल बाधाओं को दिया गया प्रकार है। हस्ताक्षर में

(Num a) => a -> a -> a 

(Num a)तरहConstraint के प्रकार है।

+0

मैं लगभग समझता हूं, लेकिन मैं एक नौसिखिया हूं। क्या आप थोड़ा सा विस्तार कर सकते हैं? – orome

+0

यदि मैं वास्तव में ': t tofu' देखता हूं तो यह थोड़ा कम क्रिप्टिक है। हालांकि मैं अभी भी थोड़ा धुंधला हूँ। – orome

+0

अब अपडेट पर काम कर रहा है – crockeea

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