Tipe Data Aljabar berbeda karena dapat dibangun dari beberapa jenis "hal". Sebagai contoh, sebuah Pohon dapat mengandung apa pun (Kosong), Leaf, atau Node.
data Tree = Empty
| Leaf Int
| Node Tree Tree
Karena Node terdiri dari dua Pohon, tipe data aljabar dapat bersifat rekursif.
Pencocokan pola memungkinkan tipe data aljabar didekonstruksi dengan cara yang menjaga keamanan tipe. Pertimbangkan implementasi kedalaman berikut ini dan yang setara dengan kodesemu:
depth :: Tree -> Int
depth Empty = 0
depth (Leaf n) = 1
depth (Node l r) = 1 + max (depth l) (depth r)
dibandingkan dengan:
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)
Ini memiliki kelemahan yang harus diingat oleh programmer untuk menggunakan Empty before Leaf sehingga field1 tidak diakses pada pohon Empty. Demikian juga, kasus Leaf harus dideklarasikan sebelum kasus Node sehingga field2 tidak diakses di Leaf. Dengan demikian jenis keamanan tidak dipertahankan oleh bahasa tetapi lebih memaksakan beban kognitif tambahan pada programmer. Ngomong-ngomong, saya mengambil contoh-contoh ini langsung dari halaman wikipedia.
Tentu saja, langauge yang mengetik bebek bisa melakukan sesuatu seperti ini:
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
Jadi tipe data aljabar mungkin tidak benar-benar lebih baik daripada yang setara dengan OOP mereka, tetapi mereka memberikan serangkaian ketegangan yang berbeda untuk bekerja dengan ketika membangun perangkat lunak.