বীজগণিত ডেটা প্রকারের মধ্যে স্বতন্ত্র যে এগুলি বিভিন্ন ধরণের "জিনিস" থেকে তৈরি করা যায়। উদাহরণস্বরূপ, একটি গাছের মধ্যে কিছুই নেই (খালি), একটি পাতা বা নোড।
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 অ্যাক্সেস না হয়। সুতরাং টাইপ সুরক্ষা ভাষা দ্বারা রক্ষণ করা হয় না বরং প্রোগ্রামার উপর অতিরিক্ত জ্ঞানীয় বোঝা চাপায়। যাইহোক, আমি উইকিপিডিয়া পৃষ্ঠা থেকে সরাসরি এই উদাহরণগুলি ধরছি bing
অবশ্যই, হাঁসের-টাইপিং ল্যাঙ্গেজ এরকম কিছু করতে পারে:
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
সুতরাং বীজগণিত তথ্য প্রকারগুলি তাদের ওওপি সমতুল্যতার চেয়ে কড়াভাবে ভাল নাও হতে পারে তবে তারা সফটওয়্যার তৈরির সময় বিভিন্ন ধরণের টানাপোড়েন সরবরাহ করে।