में पारस्परिक रूप से निर्भर डिफ़ॉल्ट विधि कार्यान्वयन को शामिल करना मैं कुछ गुणों के साथ एक विशेषता को परिभाषित करना चाहता हूं जिसमें एक अच्छी तरह से परिभाषित संबंध है - उदाहरण के लिए, मान लें कि a * b = c
। विचार यह है कि इस विशेषता के कार्यान्वयन इनमें से दो प्रदान कर सकते हैं और स्वचालित रूप से प्राप्त तीसरी संपत्ति के लिए एक एक्सेसर है।स्कैला
( यह हास्केल के प्रकार वर्ग के रूप में एक ही सुविधा है, अगर मैं उन सही ढंग से है, जहां अगर आप (मैं सही ढंग से हास्केल के प्रकार कक्षाओं याद नहीं)Ord
से <
परिभाषित याद है, >=
! . <
के रूप में लागू किया जाएगा - हालांकि आप शेष के रूप में इतने लंबे समय के किसी भी कार्य के सबसेट निर्धारित कर सकते हैं । अनुमान लगाया जा सकता है)
भोली दृष्टिकोण वास्तव में काफी अच्छी तरह से काम करता है:।
trait Foo {
// a * b = c
def a: Double = c/b
def b: Double = c/a
def c: Double = a * b
}
class FooOne(override val a: Double, override val b: Double) extends Foo
class FooTwo(override val a: Double, override val c: Double) extends Foo
यहाँ, कार्यान्वयन FooOne
और FooTwo
Foo
के पूर्ण कार्यान्वयन हैं, और अपेक्षित व्यवहार करते हैं। अब तक सब ठीक है; यह दृष्टिकोण वर्गों को दो गुणों को परिभाषित करने और तीसरे को "मुफ्त में" प्राप्त करने की अनुमति देता है।
हालांकि, बातें करता है, तो एक एक तृतीय श्रेणी को परिभाषित करता है कम गुलाबी देखने के लिए शुरू:
class FooFail(override val a: Double) extends Foo
यह ठीक संकलित - हालांकि, यह एक ढेर अतिप्रवाह कारण होगा अगर इसके b
या c
तरीकों कभी मूल्यांकन किया जाता है।
तो भोली दृष्टिकोण हास्केल के प्रकार वर्ग दृष्टिकोण के अनुमान पहलू देता है, लेकिन हम संकलन समय सुरक्षा की जरूरत नहीं है। यदि मैं कक्षाओं को कार्यान्वित करके दो तरीकों से कम परिभाषित किया गया है तो संकलक शिकायत करने के लिए मैं क्या चाहता हूं। स्पष्ट रूप से वर्तमान वाक्यविन्यास यहां पर्याप्त नहीं है; हमें अमूर्त मानने के तरीकों की आवश्यकता होती है, यद्यपि एक डिफ़ॉल्ट कार्यान्वयन के साथ प्रयोग किया जा सकता है, यदि केवल और यदि निर्भर विधियां गैर-सारणी हों।
क्या स्कैला इसे परिभाषित करने के लिए उपयुक्त अर्थशास्त्र का पर्दाफाश करता है? (अगर मुझे परिभाषित करने का कुछ हद तक चौराहे वाला तरीका है, तो मुझे कोई समस्या नहीं है, union types के समान, क्योंकि मुझे भाषा में इसके लिए किसी प्रथम श्रेणी के समर्थन के बारे में पता नहीं है)।
यदि नहीं, तो मैं भद्दा दृष्टिकोण के साथ करूँगा और बस अपनी कक्षाओं को सावधानी से परिभाषित और परीक्षण करूँगा। लेकिन मुझे सच में लगता है कि यह ऐसा कुछ है जो टाइप सिस्टम को पकड़ने में सक्षम होना चाहिए (आखिरकार - यह रूबी नहीं है। :))।
जब तक मैं पूरी तरह से गलत नहीं मानता, तब तक हास्केल एक ही समस्या के साथ एक ही भद्दा दृष्टिकोण का उपयोग करता है। –
@Alexey - दिलचस्प टिप्पणी। यह थोड़ी देर हो गया है, लेकिन मुझे याद है कि यदि आपने पर्याप्त तरीकों को परिभाषित नहीं किया है तो आपको लाइनों के साथ सभी विधियों को प्राप्त करना संभव नहीं था, इस लाइन के साथ एक कंपाइलर/दुभाषिया त्रुटि प्राप्त होगी। हो सकता है कि मैं इसे पुन: उत्पन्न करने की कोशिश करूंगा, और प्रेरणा के लिए हास्केल इसे कैसे करता हूं, इस पर पढ़ता हूं। –
ठीक है, इसने हास्केल में इसका परीक्षण किया है, यह वास्तव में एक ही समस्या से पीड़ित है (यह स्कैला की स्थिति के बराबर है जिसमें यह केवल पूरी तरह से अमूर्त तरीकों के बारे में चेतावनी देता है)। उस ने कहा, सवाल अभी भी खड़ा है, यद्यपि किसी अन्य भाषा में उदाहरण के बिना। –