क्या प्रोग्रामिंग भाषाएं हैं जो आपको प्रकारों पर अंकगणित सेट करने की अनुमति देती हैं?


9

जिज्ञासा से बाहर, क्या ऐसी भाषाएं हैं जो आपको नए प्रकार बनाने के लिए प्रकारों पर अंकगणित सेट करने की अनुमति देती हैं? कुछ इस तरह:

interface A {
  void a();
  void b();
}

interface B {
  void b();
  void c();
}

interface C = A & B; // has b()
interface D = A | B; // has a(), b() and c()
interface E = (A & B) ^ B; // has c()

मुझे पता है कि कुछ भाषाओं में इन विचारों को व्यक्त किया जा सकता है (यानी, जावा में List<Comparable & Serializable>इंटरफेस के मिलन के लिए), लेकिन मैंने कभी ऐसी भाषा के बारे में नहीं सुना है जो टाइप अंकगणित का समर्थन करती हो। धन्यवाद!


7
ऐसा तंत्र कैसे उपयोगी होगा?
रॉबर्ट हार्वे

4
एक पैटर्न जो मैंने बहुत देखा है वह एक इंटरफ़ेस है जो दो अन्य इंटरफेस का विस्तार करता है और इसमें कुछ भी नहीं जोड़ा जाता है (यानी, CanWriteAndCompare extends Serializable, Comparable {}) और मैं सोच रहा था कि इसे कैसे सामान्य किया जाए।
हेल्डेन ब्राउन

2
इसके अलावा, मैं आज एक ऐसे मामले में भाग गया, जहाँ मेरे पास एक ऐसी विधि है जो एक Aया एक ले सकती है B, दो कार्यान्वयन जो बिल्कुल एक जैसे दिखते हैं। इस पद्धति में मैं एक बहुरूपिक विधि कह रहा हूं जो एक Aया एक ले सकती है B, इसलिए कार्यान्वयन समान हैं, लेकिन चूंकि मुझे दो अलग-अलग प्रकार लेने हैं, इसलिए मुझे दो कार्यान्वयन की आवश्यकता है। यह आसान होता अगर मैं कर पाता myMethod(A | B aOrB)
हेल्डेन ब्राउन


1
Orऑपरेशन कई विरासत द्वारा अनुकरण किया जा सकता है।
उपयोगकर्ता

जवाबों:


4

स्पर्शरेखा ( 0.3 कल्पना ) इसके लिए कुछ का उपयोग करता है। (अस्वीकरण: यह मेरी अपनी छोटी शोध परियोजना है)

वर्तमान में withसंघ संचालक मॉडलिंग विरासत के रूप में कार्य करता है, हालांकि व्यावहारिकता ने इसे सराहनीय नहीं बनाया है। एक बार जब आप तरीकों के लिए कार्यान्वयन शुरू करते हैं, तो एक ही नाम के तरीकों का एक सख्त संघ अक्सर ऐसा नहीं होता है जो आप चाहते हैं और सही रास्ते पर करना असंभव है।

intersectसमर्थन किया जाता है कि मॉडल कुछ के लिए अनुमान लगाते हैं जैसे foo(T,T)कि पैरामीटर अलग कहां हैं।

पूर्णताएं दिलचस्प थीं, लेकिन आंशिक प्रकारों के कारण जो उपयोगी नहीं थे और / या परेशानी को सही ढंग से शामिल करने के लिए - इसलिए शामिल नहीं थे।

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

यह पक्षपाती है, और यह ज्यादा नहीं है, लेकिन यह है।


5

हाँ, सीलोन तदर्थ संघ और चौराहे प्रकार के साथ एक भाषा है, जैसा कि सीलोन दौरे के इस अध्याय में वर्णित है:

http://ceylon-lang.org/documentation/1.0/tour/types/

यह आप से बाहर निकलने के लिए शांत मुहावरों की संख्या अद्भुत है। यहाँ एक दिलचस्प उदाहरण मैंने हाल ही में ब्लॉग किया है । और यहां एक छोटी प्रस्तुति है जहां मैं कई सरल मुहावरों पर जल्दी से चमकता हूं

इससे भी बेहतर, संघ / चौराहे प्रकार "लापता लिंक" हैं जो कि सीलोन में जेनेरिक प्रकार के तर्क को वास्तव में सही काम करते हैं, अन्य भाषाओं के विपरीत जो उपप्रकार और पैरामीट्रिक बहुरूपता को जोड़ती हैं।

ध्यान दें कि इस प्रकार की सीमाएँ हैं "टाइप अंकगणित", जैसा कि आपने इसे वर्णित किया है। उदाहरण के लिए, आपके पास प्रकार के स्तर पर एक सेट पूरक ऑपरेटर नहीं हो सकता है, कम से कम अवांछनीयता को पेश किए बिना नहीं।

HTH


3

स्काला आंशिक रूप से इसका समर्थन करता है (चौराहों पर यूनियनों का नहीं), और संरचनात्मक उपप्रकारण के साथ कोई भी भाषा (मुझे लगता है कि ओकेएमएल एक उदाहरण है) या एक प्रकार की प्रणाली जो अनुकरण करने के लिए पर्याप्त शक्तिशाली है (हास्केल एक क्लासिक एक है) में पूर्ण या प्रकार-जैसे-सेट होंगे "क्षमताएँ, कम से कम इसके प्रकार प्रणाली के टुकड़े के भीतर जो ऐसी चीजों को स्वीकार करती है (प्रासंगिक है जब इसे एला एचएलस्ट / ओओहास्केल का अनुकरण किया जाता है)।

चूँकि मैं OCaml को अच्छी तरह से नहीं जानता, इसलिए मैं आपके उदाहरण का हिस्सा दूँगा जो Scala में काम करता है:

trait A {
  def a(): Unit
  def b(): Unit
}

abstract class B { // just to prove it works with both traits and classes
  def b(): Unit
  def c(): Unit
}

type C = A with B
type D = { def b(): Unit } // not an exact translation, because unions aren't directly available
// type `E` is unrepresentable

हास्केल के लिए एक संस्करण आपके द्वारा उपयोग किए जा रहे रिकॉर्ड सिस्टम पर निर्भर करेगा, और संभवतः कुछ हद तक क्लंकी होगा, क्योंकि यह मूल रूप से समर्थित के बजाय अनुकरण किया जाएगा।

जहाँ तक मुझे पता है, सीलोन के पास पूर्ण शक्ति में भाषा में निर्मित चौराहा और संघ दोनों प्रकार हैं, इसलिए आप उन लोगों के संदर्भ में एक प्रकार के स्तर "xor" को बता सकते हैं।


1

जावा कुछ संदर्भों में इंटरफ़ेस प्रकारों के चौराहों का समर्थन करता है, हालांकि यह अभी तक नहीं है क्योंकि मैं बता सकता हूं कि चौराहों के प्रकारों के चर के निर्माण की अनुमति दे सकता है। ? :ऑपरेटर का उपयोग करते समय, उदाहरण के लिए, अंतर्विरोध प्रकार खेल में आ सकते हैं । यदि उस ऑपरेटर के लिए दूसरा और तीसरा ऑपरेटर असंबंधित इंटरफेस हैं जो इंटरफेस के ओवरलैपिंग सेट से विरासत में मिला है, तो ऑपरेटर का परिणाम उन इंटरफेस का सेट होगा जो दोनों के लिए सामान्य हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.