8

मैंने हास्केल में गणितीय Vector मॉड्यूल लिखा था।हास्केल डेटा प्रकार उपनाम नाम

तो मैं के साथ बाहर शुरू कर दिया:

data Vector a = Vector !a !a !a deriving (Eq, Show) 

फाइन-यह मुझे किसी भी संख्यात्मक डेटा प्रकार मैं चाहता हूँ का उपयोग करने देता है। समस्या यह है कि मैं हर संभव कारण के लिए Double और Vector Double लिखना नहीं चाहता हूं। इसलिए मैं जोड़ें:

type Scalar = Double 
type Vector = Vector Scalar 

लेकिन निश्चित है कि दूसरी पंक्ति गलत है, के बाद से वहाँ अब Vector के दो घोषणाओं हैं। तो मुझे इसे क्या बदलना चाहिए? मैं खुद से सोचता हूं, नहीं, मैं इसे अपने कोड पर लिखने जा रहा हूं, इसलिए मैं टाइप उपनाम को Vector के रूप में छोड़ना चाहता हूं। जिसका अर्थ है कि मुझे डेटा प्रकार का नाम बदलना है। लेकिन अगर मैं इसे बदलता हूं, तो मुझे लगता है कि मुझे कन्स्ट्रक्टर भी बदलना चाहिए, जो सब कुछ और भ्रमित कर देता है। लेकिन अगर यह अजीब लगता है कि कन्स्ट्रक्टर के पास इस तरह के उपनाम के समान नाम है।

type Scalar = Double 
type Vector = VectorT Scalar 

data VectorT a = Vector !a !a !a deriving (Eq, Show) 

मैं T मनमाने ढंग से उठाया (मैं इसे "प्रकार" के लिए खड़ा है लगता है), लेकिन मैं इस बारे में इतना यकीन नहीं कर रहा हूँ:

अभी मैं इस किया है। आम तौर पर जब मैं दस्तावेज़ों को दस्तावेज करता हूं तो मैं -- Calculate the magnitude of a Vector कहूंगा, लेकिन VectorT के साथ मुझे लगता है कि मुझे वास्तव में का उपयोग करना चाहिए जो प्रकार का नाम है। इसलिए मैं उन्हें vectors (पूंजीकृत नहीं) के रूप में संदर्भित करने का सहारा लेता हूं - इसके बाद मुझे लगता है कि मुझे इस सम्मेलन को प्रत्येक डेटा प्रकार के लिए प्रत्येक टिप्पणी पर लागू करना होगा।

क्या कोई भी इसी तरह की स्थिति में है? क्या कोई इस मामले में एक और अधिक सुरुचिपूर्ण समाधान के बारे में सोच सकता है?

+0

मैंने इसे कुछ मौकों पर देखा है, विशेष रूप से 'भाषा-सी' पैकेज इस वाक्य का उपयोग अपने वाक्यविन्यास वृक्ष प्रतिनिधित्व को परिभाषित करने के लिए करता है। यदि आप थोड़ा अजीब महसूस करने से पहले कभी शैली का सामना नहीं किया है, लेकिन मुझे उम्मीद है कि लोग इसे बहुत जल्दी आदी हो जाएंगे। –

+6

कंप्यूटर विज्ञान में केवल दो कठिन चीजें हैं: कैश अमान्यता और नामकरण चीजें। - फिल कर्ल्टन –

+2

शायद 'वेक्टर' डबल 'यदि आप' वेक्टर टी नापसंद करते हैं। – kennytm

उत्तर

8

आपकी विशेष समस्या का एक समाधान डेटा प्रकार को समानार्थी नाम से अलग मॉड्यूल में रखना होगा। यही है, Math.Vector मॉड्यूल जिसमें डेटा घोषणा और कुछ सामान्य कार्य शामिल हैं (यानी, सभी संख्यात्मक प्रकारों के लिए काम करने वाले फ़ंक्शन)। तब, जब आप वास्तव में एक बहुत कुछ अपने कोड में Vector Double उपयोग करते हैं, बस प्रकार पर्याय एक योग्य आयात का उपयोग बनाने के लिए:

import qualified Math.Vector as MV 

type Scalar = Double 
type Vector = MV.Vector Scalar 

मैं इस एक कोड संगठन के दृष्टिकोण से समझ में आता है लगता है। विशेष रूप से, यदि आपने अपने Vector को सभी संख्यात्मक प्रकारों पर काम करने के लिए टाइप किया है, तो मुझे उम्मीद है कि उस मॉड्यूल में कार्य सभी संख्यात्मक प्रकारों पर भी काम करेगा। तथ्य यह है कि आप कोड के किसी अन्य भाग में Vector Double का उपयोग करते हैं, उस मॉड्यूल को प्रभावित नहीं करना चाहिए जहां Vector वास्तव में परिभाषित किया गया है। आखिरकार, Vector Int का उपयोग करके कल्पना करना पूरी तरह से उचित है कि आपके प्रोग्राम के एक और हिस्से में बहुत कुछ है।

एक तरफ के रूप में, मुझे यकीन नहीं है कि इसे Vector कॉल करना सबसे अच्छा विचार है। एक वेक्टर में तीन आयाम होने की आवश्यकता नहीं होती है, इसलिए मैं आपके डेटा प्रकार को Vector3D पर कॉल करूंगा। यह वास्तव में कुछ अन्य एपीआई (जैसे जावा 3 डी एपीआई) में उपयोग किया जाने वाला नाम है, इसलिए यह शायद एक अच्छी पसंद है।

2

वहाँ न सिर्फ

data Vector = Vector !Double !Double !Double deriving (Eq, Show) 

जो मुझे करने का सबसे सरल विचार की तरह लगता करने के लिए कोई विशेष कारण है ...

+0

इसका लाभ '{- # UNPACK # -}' सक्षम होने का भी लाभ है। – FunctorSalad

+0

तब मैं इसे 'फंक्टर' और 'आवेदक' का उदाहरण नहीं बना सकता। – mk12

+0

और यह किसी भी वेक्टर पर कुछ भी 'fmap' करने में सक्षम होने के लिए उपयोगी है-यदि कुछ और नहीं है, तो यह मॉड्यूल कार्यान्वयन को सुंदर बनाता है। – mk12

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