2017-07-01 7 views

उत्तर

2

यह DataKinds कार्रवाई में है, जो:

  • लिफ्टों प्रकार स्तर पर मूल्यों, और
  • सूचियों प्रकार प्रकार के लिए निकटतम आप इस के लिए प्राप्त कर सकते हैं एक और विस्तार को चालू करने की आवश्यकता है स्तर

हालांकि यह प्रकार के स्तर पर भ्रम का कारण बनता है। अब, प्रकार में, [X] या तो [X] :: *, सूची के- X प्रकार हो सकता है, या बजाय हम उठाने की वजह से [X] :: [T] हो सकता है - कि मूल्य [X] (केवल एकल मान X युक्त सूची), प्रकार की X साथ है T, प्रकार के स्तर पर उठाया गया।

इस अस्पष्टता को दूर करने के लिए, जीएचसी को उठाए गए मूल्य निर्माणकर्ताओं के सामने एक उद्धरण की आवश्यकता है। तो, हमारे पास [X] :: * है, और '[X] :: [T] है।

Concretely, आपके मामले में, Get '[JSON] [User] दोनों सूची मूल्य [JSON] प्रकार स्तर तक उठा लिया, और सूची प्रकार [User] शामिल है। अंतर की बेहतर सराहना करने के लिए, ध्यान दें कि '[JSON] प्रकार के कोई (उपयोगी) शब्द नहीं हैं, क्योंकि यह एक सूची प्रकार नहीं है। हम Get '[JSON,JSON,JSON] [User] भी एक अच्छी तरह से अभिव्यक्ति अभिव्यक्ति के रूप में, या यहां तक ​​कि Get '[] [User] भी हो सकता है। इसके बजाय, [User,User] के बाद से हमारे पास Get '[JSON] [User,User] नहीं हो सकता है।

(प्रकार Get '[JSON,JSON,JSON] [User], भले ही वह वैध है, सार्थक नौकर पुस्तकालय द्वारा इस्तेमाल किया नहीं जा सका। मैं क्या उस सूची को उठा लिया नौकर में के लिए प्रयोग किया जाता है की कोई अंदाज़ा नहीं है।)

5

उद्धरण प्रयुक्त प्रकार के प्रकार-स्तरीय रचनाकार बनाम टर्म-स्तरीय रचनाकारों को अलग करने के लिए उपयोग किए जाते हैं।

उदाहरण के लिए:

{-# LANGUAGE DataKinds #-} 

data Which = One | Two 

myPick :: Which -- Type 
myPick = One 

type MyPick :: Which -- Kind 
type MyPick = 'One 

वैसे, तरह एनोटेशन type MyPick :: Which हास्केल मान्य नहीं है, लेकिन यह आप अवधि और प्रकार के स्तर के बीच पत्राचार की एक विचार देता है।

{-# LANGUAGE TypeFamilies #-} 

type family MyPick :: Which where 
    MyPick = 'One 
संबंधित मुद्दे