2012-10-29 8 views
5

मैं भूगर्भीय गणना के लिए एक पुस्तकालय लिख रहा हूं। एक चीज जिसे मैं शामिल करना चाहता हूं वह ग्रिड अनुमानों (जैसे ऑर्डनेंस सर्वे नेशनल ग्रिड) के लिए एक प्रकार है और उन ग्रिड पर अंक ("पूर्वोत्तर" और "उत्तर" द्वारा निर्दिष्ट)। एक ग्रिड को मूल बिंदु से निर्दिष्ट किया जाता है जो इसे पृथ्वी और ज्यामितीय मानकों का एक गुच्छा से जोड़ता है। एप्लिकेशन प्रोग्रामर इन मानकों का उपयोग करके कई मनमानी ग्रिड बना सकता है। विभिन्न अंतर्निहित अनुमानों के आधार पर कई प्रकार के ग्रिड भी होने जा रहे हैं।मैं असंगत मानों को अलग करने के लिए प्रकारों का उपयोग कैसे करूं

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

मुझे अंतर्निहित एलिप्सिड पर भूगर्भीय स्थितियों (अक्षांश & रेखांश) के साथ भी एक ही समस्या मिली है। लेकिन ग्रिड संस्करण शायद समझाने में आसान है, यह देखते हुए कि इस प्रश्न का ध्यान भूगर्भ विज्ञान की बजाय टाइप सिस्टम है।

मैंने जीएडीटी और अस्तित्व के प्रकारों पर पढ़ा है, लेकिन मैं यह नहीं देख सकता कि यह कैसे करें।

+0

टाइप गणित के साथ ऐसा करने का एक तरीका हो सकता है: http://www.haskell.org/haskellwiki/Type_arithmetic – Wes

+0

"लेकिन साथ ही मैं एक प्रोग्राम प्रोग्रामर को पूछने से रोकने के लिए हास्केल प्रकार प्रणाली का उपयोग करना चाहता हूं विभिन्न ग्रिड पर दो बिंदुओं के बीच की दूरी "- वह क्यों है? अंक अलग-अलग ग्रिड पर परिभाषित किए जा सकते हैं और फिर भी उसी _physical_ स्थान का प्रतिनिधित्व करते हैं, आप ऐसे बिंदुओं के बीच की दूरी की गणना क्यों नहीं करना चाहेंगे? – leftaroundabout

+0

@ बाएंराउंडबाउट: हाँ, लेकिन इसके लिए एक समन्वय परिवर्तन और अधिक जटिल गणना की आवश्यकता है। इसके अलावा कुछ मामलों में सरल प्लानर गणना सही बात है (उदाहरण के लिए जब रडार से निपटना)। –

उत्तर

2

आप ग्रिड वे से आते हैं के साथ निर्देशांक चिह्नित करने के लिए अनुमति देने के लिए दो GHC एक्सटेंशन का उपयोग कर सकते हैं: (। एक्सटेंशन GHC में काम करते हैं 7.4+ कम कुछ भी जानकारी नहीं दे पाता,)

{-# LANGUAGE DataKinds, KindSignatures #-} 

data CoordinateType = Geodetic | OSNG -- etc. 

data Coordinate (grid :: CoordinateType) = Coord Int Int 

zeroZero :: Coordinate Geodetic 
zeroZero = Coord 0 0 

distance :: Coordinate grid -> Coordinate grid -> Float 
distance p q = undefined 

अब distance zeroZero (Coord 1 2 :: Coordinate OSNG) एक प्रकार त्रुटि देता है: तो फिर, यह आवश्यकता होती है किसी भी काम करता है grid प्रेत पैरामीटर की समानता लागू कर सकते हैं।

+0

यदि मैं इसे सही ढंग से समझता हूं, तो यह केवल कोऑर्डिनेट टाइप मानों की एक हार्ड कोडित सूची के लिए काम करता है (जिसे मैंने वास्तव में पहले से ही टाइप क्लास का उपयोग करके किया है, यद्यपि अधिक क्रियात्मक रूप से)। मैं "डेटा कोर्डटाइप = ग्रिड डबल डबल" जैसे कुछ कहना चाहता हूं ताकि "foo = ग्रिड 3 4; बार = ग्रिड 2 4.2" मुझे प्रकार के स्तर पर "बार" में निर्देशांक से "foo" में निर्देशांक को अलग करने की अनुमति देता है। –

+0

@ पॉल जोहानसन, आप मूल्यों की हार्ड कोडित सूची तक सीमित नहीं हैं, क्योंकि अब (जीएचसी 7 की आवश्यकता है।6) आप प्रकार के स्तर ("प्रचारित शाब्दिक") पर तारों और प्राकृतिकों का उपयोग कर सकते हैं। डेटा के बारे में दस्तावेज -> तरह का प्रचार [यहां] है (http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/promotion.html), आप देख सकते हैं कि इनमें से कोई भी मदद करता है या नहीं। – huon

+0

लेकिन उन्हें भी सचमुच होना चाहिए: मैं एक फ़ाइल से एक स्ट्रिंग में पढ़ा नहीं सकता (जहां तक ​​मैं देख सकता हूं) और इसे किसी प्रकार के प्रचारित नहीं कर सकता। –

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

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