2008-10-04 35 views
9

मैं स्कैला में एक रिलेशनल बीजगणित को एन्कोड करने का प्रयास कर रहा हूं (जो कि मेरे ज्ञान में सबसे उन्नत प्रकार की प्रणालियों में से एक है) और मुझे लगता है कि मैं कहां से प्राप्त करना चाहता हूं ।संबंधपरक बीजगणित को लागू करने के लिए भाषा विशेषताएं

जैसा कि मैं प्रोग्रामिंग भाषा डिजाइन के अकादमिक क्षेत्र के साथ अनुभव नहीं कर रहा हूं, मुझे वास्तव में पता नहीं है कि किस सुविधा को देखना है।

तो एक स्थिर रूप से सत्यापित रिलेशनल बीजगणित को लागू करने के लिए, किस भाषा की विशेषताओं की आवश्यकता होगी, और उन सुविधाओं में कौन सी भाषा है?

कुछ आवश्यकताओं: ए टुपल नाम से निर्दिष्ट प्रकार के मानों के प्रश्न में प्रश्नों के प्रश्न में प्रश्नों के प्रश्नों के लिए वैध नामों के स्थिर रूप से परिभाषित सेट से एक फ़ंक्शन मैपिंग नाम है। आइए इस नाम-प्रकार को डोमेन सेट करें।

एक रिश्ता एक ही डोमेन में इस तरह के साथ tuples का एक सेट है कि किसी भी टपल की सीमा सेट में uniqe है

अब तक मॉडल eaisly

trait Tuple 
trait Relation[T<Tuple] extends Set[T] 

द्वारा बस स्काला में तैयार किया जा सकता टुपल में vals, vars और defs ऊपर परिभाषित नाम-प्रकार सेट है। लेकिन एक ही नाम के साथ टुपल में दो डीफ नहीं होना चाहिए। इसके अलावा vars और अशुद्ध defs भी प्रतिबंधित किया जाना चाहिए।

अब मुश्किल भाग के लिए:

एक दो संबंधों के शामिल होने के एक रिश्ता जहां tuples के डोमेन ऑपरेंड tuples से डोमेन का मिलन है है। इस तरह कि केवल अपने डोमेन के चौराहे के लिए समान श्रेणी वाले tuples रखा जाता है।

def join(r1:Relation[T1],r2:Relation[T2]):Relation[T1 with T2] 

चाल चलाना चाहिए।

संबंध का प्रक्षेपण एक संबंध है जहां टुपल्स का डोमेन ऑपरेंड टुपल्स डोमेन का सबसेट है।

def project[T2](r:Relation[T],?1):Relation[T2>:T] 

यह वह जगह है जहां मुझे यकीन नहीं है कि यह एक सोल्शन खोजने के लिए भी संभव है। तुम क्या सोचते हो? परियोजना को परिभाषित करने के लिए कौन सी भाषा सुविधाओं की आवश्यकता है?

उपरोक्त प्रभाव से यह है कि एपीआई को उपयोग करने योग्य होना चाहिए। बॉयलरप्लेट की परतें और परतें स्वीकार्य नहीं हैं।

उत्तर

6

क्या आप पूछ रहे हैं कि अंतर दो अन्य प्रकारों (मूल संबंध और प्रक्षेपण परिभाषा) के रूप में संरचनात्मक रूप से परिभाषित करने में सक्षम होना है। मैं ईमानदारी से किसी भी भाषा के बारे में नहीं सोच सकता जो आपको ऐसा करने की अनुमति देगा। प्रकार संरचनात्मक रूप से संचयी (A with B) हो सकते हैं क्योंकि A with BA और B दोनों का संरचनात्मक उप-प्रकार है। हालांकि, यदि आप इसके बारे में सोचते हैं, तो एक प्रकार का ऑपरेशन A less B वास्तव में उप-प्रकार के बजाय A के सुपरटेप होगा। आप स्वाभाविक रूप से कॉन्वेंट प्रकारों पर मनमाने ढंग से, contravariant टाइपिंग संबंध के लिए पूछ रहे हैं। यह साबित नहीं हुआ है कि इस तरह की चीज नाममात्र अस्तित्वहीन प्रकारों के साथ अच्छी है, बहुत कम संरचनात्मक घोषणा-बिंदु प्रकार।

मैं मॉडलिंग की इस तरह पर काम किया है से पहले, और मार्ग मैं ले लिया तीन डोमेन से एक के लिए अनुमानों में रोके था: P == T, P == {F} where F in T, P == {$_1} where $_1 anonymous। पहला वह स्थान है जहां प्रक्षेपण इनपुट प्रकार के बराबर है, जिसका अर्थ है कि यह नो-ऑप (SELECT *) है। दूसरा कह रहा है कि प्रक्षेपण इनपुट प्रकार के भीतर एक एकल क्षेत्र है। तीसरा मुश्किल है। यह कह रहा है कि आप किसी अज्ञात प्रकार $_1 की घोषणा की अनुमति दे रहे हैं जिसमें स्थिर इनपुट प्रकार से संबंध नहीं है। संभवतः इसमें फ़ील्ड शामिल होंगे जो इनपुट प्रकार के लिए प्रतिनिधि होंगे, लेकिन हम इसे लागू नहीं कर सकते हैं। यह लगभग रणनीति है जो LINQ लेता है।

क्षमा करें मैं और अधिक सहायक नहीं हो सकता। मेरी इच्छा है कि आप जो भी पूछ रहे हैं वह करना संभव था, यह बहुत साफ संभावनाओं को खोल देगा।

+0

मैं आपको कुछ अनुच्छेदों के साथ प्रदान करना चाहूंगा जो आपने दूसरे पैराग्राफ में लिखा था .. –

2

Tutorial D उतना आसान और संबंधपरक सिद्धांत के साथ निकटता से गठबंधन किया गया है, एक भाषा हो सकती है।

+0

ट्यूटोरियल डी इस के लिए मेरी प्रेरणा है। लेकिन मैं एक नई लापरवाही लिखने से बचने की उम्मीद कर रहा था और कुछ जीपी भाषा में एपीआई को एम्बेड कर रहा था। इस मामले में स्कैला। –

+0

स्कैला के लिए एक कॉपर प्लगइन लिखना हालांकि मेरे रडार पर है। फिर भी मैं इसे ट्यूटोरियल डी कंपाइलर की तुलना में अधिक सामान्य भ्रूण के रूप में करना चाहता हूं। –

0

मुझे लगता है कि मैंने परियोजना भाग के लिए संग्रह मैपिंग के लिए सामान्य सुविधाओं का उपयोग करने पर बसने का फैसला किया है। क्लाइंट बस एक फंक्शन [T<:Tuple](t:T) => P

पी के वर्ग में जाने के लिए कुछ जावा चालबाजी के साथ क्वेरी तर्क लागू करने के लिए प्रतिबिंब का उपयोग करने में सक्षम होना चाहिए।

शामिल होने के लिए मैं मैपिंग फ़ंक्शन को लागू करने के लिए शायद डायनामिक प्रॉक्सी का उपयोग करूंगा।

बोनस के रूप में मैं एपीआई को स्कालस स्पेशल फॉर-सिंटैक्स के साथ उपयोग करने योग्य हो सकता हूं।

1

HaskellDB में कुछ विचार हैं कि प्रकार-सुरक्षित संबंधपरक बीजगणित डीएसएल कैसे बनाएं, आपको यह उपयोगी लगेगा।