2012-04-14 14 views
13

मैं एक monadic देखने योग्य/प्रतिक्रियाशील पार्सर परिभाषित कर रहा हूँ। यह एक सामान्य पार्सर के लिए काफी अलग व्यवहार करता है क्योंकि यह एक सतत क्वेरी है। अंतर्निहित प्रकार है:एक मामले का भेदभाव संघ

IObservable<'a> -> IObservable<'b> 

कार्यात्मक भाषाओं में विभिन्न पार्सर कार्यान्वयन को देखकर से ऐसा प्रतीत होता है जैसे कि चीजों को परिभाषित करने के लिए और अधिक उचित तरीके से एक ही मामला भेदभाव संघ है:

type Pattern<'a,'b> = Pattern of (IObservable<'a> -> IObservable<'b>) 

कौन सा मैं मतलब है तो इसका इस्तेमाल करने के लिए अंतर्निहित समारोह को निकालने के लिए की जरूरत है:

let find (Pattern p) = p 

सवाल है: यह सिर्फ प्रथा के अनुसार, या बाद में विस्तार के प्रयोजनों के लिए, या है परिभाषा कभी नहीं बदलती है, भले ही ऐसा करने का कोई कारण हो?

बोनस सवाल:

type Pattern<'a,'b> = IObservable<'a> -> IObservable<'b> 

मैं इस के माध्यम से काफी एक तरह से उन्नत है, और एक मामले में जहां नहीं मिला है: अगर यह सिर्फ एक और अधिक सुविधाजनक प्रकार हस्ताक्षर के लिए है, क्यों नहीं बस एक प्रकार अन्य नाम का उपयोग डीयू का उपयोग न करने से संगतता प्रभावित होती है।

उत्तर

14

एफ # संकलक प्रकार संक्षिप्त नाम के बारे में जानकारी की रक्षा नहीं करता है, ताकि आप प्रकार निष्कर्ष से बिल्कुल भी लाभ नहीं अर्थ विज्ञान के लिए एक प्रकाश अमूर्त रिसाव को ठीक है, और केवल कि,। टाइप हस्ताक्षर प्रोग्राम विनिर्देश के रूप में समझा जा सकता है; टाइप चेकर को अपना काम करना आपके कार्यक्रमों की शुद्धता सुनिश्चित करने का एक अच्छा तरीका है।

आप प्रकार उर्फ ​​के मामले में हर जगह प्रकार एनोटेशन निर्दिष्ट स्पष्ट रूप से की जरूरत है:

type Vector = float * float 

// val add : float * float -> float * float -> Vector 
let add ((x1, y1): Vector) ((x2, y2): Vector): Vector = (x1 + y1, x2 + y2) 

लेकिन यह आप पारदर्शिता नहीं देता है दस का उपयोग कर के रूप में:

type Vector = V of float * float 

// val add : Vector -> Vector -> Vector 
let add (V(x1, y1)) (V(x2, y2)) = V(x1 + y1, x2 + y2) 

जटिल कार्यक्रमों स्पष्ट प्रकार हस्ताक्षर में वास्तव में composability बनाए रखने के लिए यह आसान बनाते हैं।

एकल-मामले डीयू में अधिक मामलों को जोड़ने के लिए केवल इतना आसान नहीं है, बल्कि सदस्य और स्थिर तरीकों के साथ डीयू को विस्तार करना भी आसान है। एक उदाहरण यह है कि आप अक्सर प्रिंटिंग के लिए ToString() ओवरराइड करते हैं।

+0

धन्यवाद, यह वास्तव में एक सुंदर ठोस कारण है। निश्चित रूप से 'पैटर्न <'a,'b>' के बजाय 'IObservable <'a> -> IObservable <'b>' टाइपिंग नहीं करना चाहते हैं। – yamen

+1

बाद में कई चंद्रमाओं का पालन करें। मैंने संघ में दूसरा मामला जोड़ दिया, और इस प्रकार ब्रह्मांड संतुलन में है। – yamen

0

जो मैं समझता हूं, उससे एक मामला भेदभावित यूनियन प्रकार है जो आपके समस्या डोमेन के लिए अर्थात् प्रासंगिक है, अन्यथा सामान्य उद्देश्य बैक एंड टाइप जिसका नाम 'स्ट्रिंग' है।

यह AFAIK

+0

मुझे नहीं लगता कि यह सच है। यही एक प्रकार का उपनाम है। एक भी मामला भेदभाव संघ एक पूर्ण वर्ग है, और इस मामले में यह एक समारोह लपेट रहा है (या सी # वार्ता में प्रतिनिधि)। वास्तव में – yamen

+0

। लेकिन मुझे उससे किसी अन्य उपयोग को नहीं पता ... यह भी ध्यान दें कि आप यूनियन प्रकारों में कुछ तरीकों को जोड़ सकते हैं। – nicolas

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