बीजगणितीय डेटा प्रकार इस बात में भिन्न हैं कि उनका निर्माण कई प्रकार की "चीजों" से किया जा सकता है। उदाहरण के लिए, ट्री में कुछ भी नहीं (खाली), पत्ती या एक नोड हो सकता है।
data Tree = Empty
| Leaf Int
| Node Tree Tree
चूंकि एक नोड दो पेड़ों से बना होता है, इसलिए बीजीय डेटा प्रकार पुनरावर्ती हो सकते हैं।
पैटर्न मिलान, बीजीय डेटा प्रकारों को एक तरह से विघटित करने की अनुमति देता है जो प्रकार की सुरक्षा को बनाए रखता है। गहराई और इसके छद्म समतुल्य के निम्नलिखित कार्यान्वयन पर विचार करें:
depth :: Tree -> Int
depth Empty = 0
depth (Leaf n) = 1
depth (Node l r) = 1 + max (depth l) (depth r)
की तुलना में:
switch on (data.constructor)
case Empty:
return 0
case Leaf:
return 1
case Node:
let l = data.field1
let r = data.field2
return 1 + max (depth l) (depth r)
इसका नुकसान यह है कि प्रोग्रामर को लीफ से पहले खाली करने के लिए याद रखना चाहिए ताकि फ़ील्ड 1 किसी खाली पेड़ पर न पहुँच सके। इसी तरह, लीफ केस को नोड केस से पहले घोषित किया जाना चाहिए ताकि फील्ड 2 को लीफ पर एक्सेस नहीं किया जा सके। इस प्रकार प्रकार सुरक्षा भाषा द्वारा बनाए नहीं रखी जाती है, बल्कि प्रोग्रामर पर अतिरिक्त संज्ञानात्मक भार डालती है। वैसे, मैं इन उदाहरणों को सीधे विकिपीडिया पृष्ठों से पकड़ रहा हूं।
बेशक, एक डक-टाइपिंग लैन्गॉज़ कुछ ऐसा कर सकता है:
class Empty
def depth
0
end
end
class Leaf
def depth
1
end
end
class Node
attr_accessor :field1, :field2
def depth
1 + [field1.depth, field2.depth].max
end
end
इसलिए बीजीय डेटा प्रकार उनके ओओपी समकक्ष की तुलना में कड़ाई से बेहतर नहीं हो सकते हैं, लेकिन वे सॉफ़्टवेयर का निर्माण करते समय काम करने के लिए तनाव का एक अलग सेट प्रदान करते हैं।