ประเภทข้อมูลเชิงพีชคณิตมีความแตกต่างในการที่พวกเขาสามารถสร้างจาก "สิ่ง" หลายประเภท ตัวอย่างเช่น Tree สามารถมีอะไรก็ได้ (ว่างเปล่า), Leaf หรือ Node
data Tree = Empty
| Leaf Int
| Node Tree Tree
เนื่องจากโหนดประกอบด้วยต้นไม้สองต้นชนิดข้อมูลเชิงพีชคณิตจึงสามารถเรียกซ้ำได้
การจับคู่รูปแบบช่วยให้สามารถแยกประเภทข้อมูลเกี่ยวกับพีชคณิตในลักษณะที่รักษาความปลอดภัยได้ พิจารณาการนำความลึกและ pseudocode ไปใช้ต่อไปนี้:
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)
นี่เป็นข้อเสียที่โปรแกรมเมอร์ต้องจำไว้ว่าให้เว้นว่างไว้ก่อน Leaf เพื่อให้ไม่สามารถเข้าถึง field1 บนทรีเปล่าได้ เช่นเดียวกันกรณีใบไม้จะต้องประกาศก่อนกรณีโหนดเพื่อให้ไม่สามารถเข้าถึง field2 บนใบไม้ได้ ดังนั้นความปลอดภัยของประเภทจึงไม่ได้รับการบำรุงรักษาโดยภาษา แต่จะกำหนดภาระการรับรู้เพิ่มเติมให้กับโปรแกรมเมอร์ โดยวิธีการที่ฉันคว้าตัวอย่างเหล่านี้โดยตรงจากหน้าวิกิพีเดีย
แน่นอนว่าการพิมพ์ด้วยเป็ดสามารถทำได้ดังนี้:
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
ดังนั้นประเภทข้อมูลเชิงพีชคณิตอาจไม่ดีกว่า OOP ที่เทียบเท่าอย่างเคร่งครัด แต่จะให้ความตึงเครียดที่แตกต่างกันในการสร้างซอฟต์แวร์