यहां तीन भाषाएं हैं जो आपको अपने स्वयं के ऑपरेटरों को परिभाषित करने देती हैं, जो ढाई अलग-अलग चीजें करते हैं! हास्केल और कोक दोनों ही शेंनिगन्स के इन प्रकारों को अस्वीकार करते हैं - लेकिन अलग-अलग - जबकि एग्दा इस तरह की संघातियों के मिश्रण की अनुमति देता है।
सबसे पहले, हास्केल में , आपको बस ऐसा करने की अनुमति नहीं है। आप अपने स्वयं के ऑपरेटरों को परिभाषित कर सकते हैं और उन्हें अपनी पसंद की पूर्वता (0–9 से) और संबद्धता दे सकते हैं। हालाँकि, हास्केल रिपोर्ट आपको संघातियों को मिलाने से रोकती है :
एक ही मिसाल के साथ लगातार अविभाजित ऑपरेटरों को वाक्य रचना त्रुटि से बचने के लिए या तो बाएं या दाएं साहचर्य होना चाहिए। [हास्केल 2010 की रिपोर्ट, चौ। 3]
इसलिए, जीएचसी में , यदि हम एक पूर्ववर्ती स्तर पर बाएं-सहयोगी ( infixl
) ऑपरेटर <@
और दाएं-सहयोगी ऑपरेटर @>
को परिभाषित करते हैं - मान लें कि 0 - तो मूल्यांकन x <@ y @> z
त्रुटि देता है
पूर्वगामी पार्सिंग त्रुटि
' <@
' [ infixl 0
] और ' @>
' [ infixr 0
] को एक ही infix अभिव्यक्ति में नहीं मिला सकती है
(वास्तव में, आप एक ऑपरेटर को infix होने की घोषणा कर सकते हैं लेकिन गैर-सहयोगी, जैसे ==
, ताकि x == y == z
एक वाक्यविन्यास त्रुटि हो!)
दूसरी ओर, भरोसेमंद टाइप की गई भाषा / प्रमेय कहावत अगड़ा है (जो कि, बेशक, मुख्य रूप से कम मुख्यधारा है)। Agda में किसी भी भाषा का सबसे अधिक निंदनीय वाक्य रचना है, जो मुझे पता है, मिक्सफिक्स ऑपरेटरों का समर्थन : मानक पुस्तकालय में फ़ंक्शन होता है
if_then_else_ : ∀ {a} {A : Set a} → Bool → A → A → A
जो, जब कहा जाता है, लिखा जाता है
if b then t else f
अंडरस्कोर में भरने वाले तर्कों के साथ! मैं इसका उल्लेख करता हूं क्योंकि इसका मतलब है कि इसे अविश्वसनीय रूप से लचीली पार्सिंग का समर्थन करना है। स्वाभाविक रूप से, AGDA भी (अपने पूर्वता स्तर पर मनमाने ढंग से प्राकृतिक संख्या की सीमा, और 0-100 में आम तौर पर कर रहे हैं, हालांकि) स्थिरता घोषणाओं है, और AGDA करता है एक ही पूर्वता लेकिन अलग fixities के ऑपरेटरों मिश्रण करने की अनुमति। हालाँकि, मैं इस बारे में दस्तावेज़ में जानकारी नहीं ढूँढ सकता, इसलिए मुझे प्रयोग करना था।
चलो हमारे <@
और @>
ऊपर से पुन: उपयोग करें । दो सरल मामलों में, हमारे पास है
x <@ y @> z
पार्सिंग के रूप में x <@ (y @> z)
; तथा
x @> y <@ z
पार्सिंग के रूप में (x @> y) <@ z
।
मुझे लगता है कि एजडा क्या करती है, लाइन को "लेफ्ट एसोसिएटिव" और "राइट एसोसिएटिव" चंक्स में समूहित किया जाता है, और - जब तक मैं गलत चीजों के बारे में नहीं सोच रहा हूँ - सही-एसोसिएटिव चंक को आसन्न तर्कों को हथियाने में "प्राथमिकता" मिलती है। तो वह हमें देता है
a <@ b <@ c @> d @> e @> f <@ g
पार्सिंग के रूप में
(((a <@ b) <@ (c @> (d @> (e @> f)))) <@ g
या
हालाँकि, मेरे प्रयोगों के बावजूद, मैंने पहली बार गलत लिखा था कि मैंने इसे लिखा था, जो शिक्षाप्रद हो सकता है :-)
(और हास्केल की तरह अगाडा के पास गैर-सहयोगी ऑपरेटर्स हैं, जो पार्स त्रुटियों को सही ढंग से देते हैं, इसलिए मिश्रित एसोसिएटिविटीज के लिए पार्स त्रुटि भी परिणाम करना संभव होगा।)
अंत में, वहाँ प्रमेय-कहावत / निर्भरता से टाइप की गई भाषा Coq है , जिसमें Agda की तुलना में अधिक लचीला वाक्यविन्यास है क्योंकि इसके वाक्यविन्यास एक्सटेंशन वास्तव में नए वाक्य रचना के लिए विशिष्टताओं को लागू करके और फिर उन्हें मुख्य भाषा में फिर से लिखना (अस्पष्ट रूप से मैक्रो-जैसे) हैं , मुझे लगता है)। Coq में, सूची सिंटैक्स [1; 2; 3]
मानक लाइब्रेरी से एक वैकल्पिक आयात है। नए वाक्यविन्यास भी चर बाँध सकते हैं!
एक बार फिर, कोक में, हम अपने स्वयं के इनफिक्स ऑपरेटरों को परिभाषित कर सकते हैं और उन्हें पूर्व स्तर (099 से, ज्यादातर) और संबद्धता दे सकते हैं। हालाँकि, Coq में, प्रत्येक पूर्ववर्ती स्तर में केवल एक समरूपता हो सकती है । इसलिए अगर हम <@
वाम-सहयोगी के @>
रूप में परिभाषित करते हैं और फिर समान स्तर पर दाएँ-सहयोगी के रूप में परिभाषित करने का प्रयास करते हैं - कहते हैं, 50 - हमें मिलता है
त्रुटि: स्तर 50 पहले से ही बाएं साहचर्य घोषित किया गया है, जबकि यह अब सही सहयोगी होने की उम्मीद है
Coq में अधिकांश ऑपरेटर 10 के स्तर से विभाज्य हैं; अगर मेरे पास सहानुभूति के मुद्दे हैं (ये स्तर के सहसंबंध वैश्विक हैं), तो मैंने आम तौर पर किसी भी दिशा में एक स्तर (आमतौर पर ऊपर) को टक्कर दी है।