कुछ समस्याएं हैं जो आसानी से बीजगणितीय डेटा प्रकारों द्वारा हल की जाती हैं, उदाहरण के लिए एक सूची प्रकार बहुत संक्षिप्त रूप में व्यक्त किया जा सकता है:
data ConsList a = Empty | ConsCell a (ConsList a)
consmap f Empty = Empty
consmap f (ConsCell a b) = ConsCell (f a) (consmap f b)
l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty))
consmap (+1) l
यह विशेष उदाहरण हास्केल में है, लेकिन यह अन्य भाषाओं में बीजगणितीय डेटा प्रकारों के लिए देशी समर्थन के समान होगा।
यह पता चलता है कि OO- शैली के उप-योग के लिए एक स्पष्ट मानचित्रण है: डेटाटैब एक अमूर्त आधार वर्ग बन जाता है और हर डेटा कंस्ट्रक्टर एक ठोस उपवर्ग बन जाता है। यहाँ एक उदाहरण है स्काला में:
sealed abstract class ConsList[+T] {
def map[U](f: T => U): ConsList[U]
}
object Empty extends ConsList[Nothing] {
override def map[U](f: Nothing => U) = this
}
final class ConsCell[T](first: T, rest: ConsList[T]) extends ConsList[T] {
override def map[U](f: T => U) = new ConsCell(f(first), rest.map(f))
}
val l = (new ConsCell(1, new ConsCell(2, new ConsCell(3, Empty)))
l.map(1+)
भोले उपवर्ग से परे आवश्यक एकमात्र चीज कक्षाओं को सील करने का एक तरीका है , अर्थात एक पदानुक्रम में उपवर्गों को जोड़ना असंभव बनाने का एक तरीका है।
आप इस समस्या को C # या Java जैसी भाषा में कैसे समझेंगे? जब मैं सी # में बीजगणितीय डेटा प्रकारों का उपयोग करने की कोशिश कर रहा था, तो दो ठोकरें मिलीं:
- मैं यह नहीं पता लगा सकता कि नीचे का प्रकार C # में क्या कहा जाता है (यानी मैं यह पता नहीं लगा सकता कि क्या डालूं
class Empty : ConsList< ??? >
) - मैं सील
ConsList
करने का कोई तरीका नहीं निकाल सका ताकि कोई उपवर्ग पदानुक्रम में न जोड़ा जा सके
सी # और / या जावा में बीजगणितीय डेटा प्रकारों को लागू करने का सबसे मुहावरेदार तरीका क्या होगा? या, यदि यह संभव नहीं है, तो मुहावरेदार प्रतिस्थापन क्या होगा?