2012-05-17 18 views
13
data Ray = Ray Vector Vector 

याहास्केल: बीजीय डेटा टपल बनाम

type Ray = (Vector, Vector) 

कौन सा मुहावरेदार हास्केल में पसंद किया जाता है? मुझे दूसरे पर एक का उपयोग क्यों करना चाहिए?
मुझे प्रदर्शन के बारे में परवाह नहीं है।

यह जैसे कार्यों के साथ थोड़ा अंतर, बनाने के लिए लगता है:

trace :: Ray -> … 

trace (Ray x d) = … 
-- OR 
trace (x, d) = … 

उत्तर

10

के रूप में यह और अधिक स्पष्ट रूप प्रोग्रामर के इरादे को इंगित करता है data संस्करण पसंद किया जाता है - एक नए प्रकार बनाने के द्वारा, आप सभी की ओर इशारा कर रहे हैं कि यह केवल एक tuple नहीं है, लेकिन एक सार्थक अर्थपूर्ण इकाई, एक Ray

इससे Ray के कस्टम उदाहरणों के साथ, और ट्यूपल्स में ऑप्टिमाइज़ेशन संभव नहीं होने के साथ-साथ टाइप सिस्टम पर आगे बढ़ना संभव हो जाता है।

+1

दाएं। और प्रकारों के बारे में एक महत्वपूर्ण बिंदु: वे डेटा के प्रतिनिधित्व से कहीं ज्यादा हैं; वे उपयोगी संरचना की विशेषता है। – pigworker

+0

ठीक है, यह समझ में आता है। 'टाइप' वास्तव में सिर्फ एक पर्याय के लिए है, न कि एक नया डेटा प्रकार। लेकिन रेखा को कहीं भी खींचा जाना चाहिए- 'टाइप रंग = (इंट, इंट, इंट)' उचित होगा, है ना? – mk12

+2

नहीं, प्रदर्शन कारणों से रंग के लिए पैक किए गए वेक्टर प्रकार के लिए अधिक समझदारी होती है, जैसे रंग पैकेज में - इस तरह के सार्थक प्रकार अनुकूलित और विशिष्ट किए जा सकते हैं। http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –

6

तुम भी है कि दोनों के संयोजन की तरह एक तीसरा विकल्प पर विचार हो सकता: newtype

newtype Ray = Ray (Vector, Vector) 

बीजीय डेटाटाइप्स, मेरी राय में, स्थितियों में मामले हैं जब में किया जाता है आप एक से अधिक विकल्प है जब, या आपको खुद को शामिल करने के लिए रिकर्सिव होने के प्रकार की आवश्यकता है। लेकिन यह इस तरह के कुछ के लिए overkill हो सकता है।

डॉन स्टीवर्ट ने इंगित किया कि टुपल के लिए एक प्रकार का समानार्थी बनाना उस टुपल प्रकार का उपयोग करने जैसा ही है; समानार्थी शब्द टाइप करें स्वयं की कोई पहचान नहीं है। तो टाइप चेकर आपके प्रकार और टुपल के बीच अंतर करने में सक्षम नहीं होगा, और इसलिए यह जांच नहीं सकता कि आप उस प्रकार का उपयोग कर रहे हैं जहां आप चाहते हैं। इसके अलावा, यह एक tuple के रूप में एक ही उदाहरण होगा।

newtype आपको उसी अंतर्निहित प्रकार को टुपल के रूप में उपयोग करने की अनुमति देता है; लेकिन यह अलग-अलग उदाहरणों के साथ टाइप चेकर के लिए एक अलग प्रकार है।

+0

यह करीबी रूप का उपयोग करने से कम आम प्रतीत होता है। शायद केवल इसलिए कि यह अधिक विराम चिह्न है। – luqui

3

एक चौथा विकल्प मैं काफी सुविधाजनक पाया रिकॉर्ड कर रहे हैं:

data Ray = Ray { from, to :: Vector } 

वे मूल रूप से सभी "सामान्य" ADTS की सुविधाएं होती हैं, लेकिन कुछ अतिरिक्त वाक्य-चीनी के साथ। खासकर वे मूल्य की आंशिक रूप से संशोधित प्रतियां प्राप्त करना आसान बनाते हैं। यह सच है कि रिकॉर्ड कुछ स्थितियों में बहुत सीमित हैं, लेकिन फिर आप fclabels जैसे "बेहतर संस्करण" के साथ आगे जा सकते हैं।

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