2011-12-22 15 views
36

के लिए डेटाटाइप पदोन्नति। प्री-रिलीज नोट्स और Giving Haskell a Promotion पेपर, मैं अभी भी प्रचारित प्रकारों के साथ वास्तव में क्या करता हूं, इस पर उलझन में हूं। उदाहरण के लिए, GHC मैनुअल पदोन्नत डेटाटाइप्स पर निम्न उदाहरण देता है:ghat 7.4 के माध्यम से पढ़ने के बाद निर्भर रूप से चुनौतीपूर्ण

data Nat = Ze | Su Nat 

data List a = Nil | Cons a (List a) 

data Pair a b = Pair a b 

data Sum a b = L a | R b 

का उपयोग करता है किस तरह इन प्रकार के रूप में है? क्या आप (कोड) उदाहरण दे सकते हैं?

+2

यह एक अच्छा सवाल है। एक अच्छा उत्तर बनाने का एक तरीका हो सकता है कि जब आप "कैबल इंस्टॉल करें" प्राप्त करते हैं तो आपको प्राप्त होने वाली उदाहरण फ़ाइलों का अनुवाद करना हो सकता है। मैं पाठक के लिए अभ्यास के रूप में SHE-code पोस्ट कर सकता हूं: क्या यह उपयोगी होगा? मैं अभी 7.4 स्थापित करने की कोशिश कर रहा हूं, लेकिन मैं तेंदुए चला रहा हूं और मुझे एक बुरा परिणाम डर है। – pigworker

+1

@pigworker, मैंने SHE उदाहरणों पर एक नज़र डालने की कोशिश की और मुझे लगता है कि मैंने कुछ हिस्सों को गड़बड़ कर दिया है, लेकिन "डमीज़ के लिए टिप्पणियों" के साथ एक सरल SHE उदाहरण शायद अच्छा भी होगा। – aleator

उत्तर

2

Nat उदाहरण के लिए हो सकता है संख्यात्मक वैक्टर बनाने के लिए प्रयोग किया जाता है जिसे केवल वही लंबाई हो सकती है, यदि संकलित समय पर चेक किया गया हो।

8

कागज अपने आप में कम से कम दो उदाहरण हैं:

"1. परिचय" कहते हैं: "उदाहरण के लिए, हम [संकलन समय पर] एक कथित लाल-काले पेड़ वास्तव में है सुनिश्चित करने के लिए सक्षम हो सकता है लाल-काले संपत्ति "।

"2.1 डेटाटाइप को बढ़ावा देना" लम्बा अनुक्रमित वैक्टर (यानी संकलन-समय के साथ वैक्टर "सीमाओं से बाहर सूचकांक) त्रुटियों पर चर्चा करता है।

आप इस दिशा में पहले के काम को भी देख सकते हैं, उदा। टाइप-सेफ हेटरोजेनस सूचियों और एक्स्टेंसिबल संग्रह के लिए एचएलआईस्ट लाइब्रेरी। Oleg Kiselyov में कई संबंधित काम हैं। आप आश्रित प्रकारों के साथ प्रोग्रामिंग पर भी काम पढ़ सकते हैं। http://www.seas.upenn.edu/~sweirich/ssgip/main.pdf में एग्डा में टाइप-स्तरीय कंप्यूटेशंस के लिए प्रारंभिक उदाहरण हैं, लेकिन इन्हें हास्केल पर भी लागू किया जा सकता है।

शायद, यह विचार है कि head सूचियों के लिए एक और सटीक प्रकार दिया गया है।

head :: List a -> a 

के बजाय यह

head :: NotEmptyList a -> a 

बाद सिर समारोह fomer की तुलना में अधिक typesafe है: यह खाली सूचियों के लिए आवेदन किया कभी नहीं किया जा सकता है, क्योंकि यह संकलक त्रुटियों का कारण।

आपको नोट-लक्षण सूची जैसे प्रकारों को व्यक्त करने के लिए प्रकार-स्तर की गणना की आवश्यकता है। कार्यात्मक निर्भरताओं वाले वर्ग टाइप करें, जीएजीटी और (अनुक्रमित) प्रकार के परिवार पहले से ही हैकेल के लिए टाइप-स्तरीय कंप्यूटेशंस के कमजोर रूप प्रदान करते हैं। आपके द्वारा उल्लिखित कार्य इस दिशा में आगे विस्तारित करता है।

केवल Haskell98 प्रकार वर्गों का उपयोग करके कार्यान्वयन के लिए http://www.haskell.org/haskellwiki/Non-empty_list देखें।

+5

मुझे लाल-काले पेड़ उदाहरण देखना बहुत पसंद आएगा। – aleator

+1

क्या आप थोड़ा विस्तार कर सकते हैं क्यों आपको NotEmptyList प्रकार के लिए टाइप लेवल कंप्यूटेशंस की आवश्यकता है? कम से कम आपके द्वारा निर्दिष्ट विकी पेज प्रकार के स्तर पर कुछ भी नहीं करता है। – aleator