Cebirsel Veri Türleri, çeşitli "şeylerden" oluşturulabilmeleri bakımından farklıdır. Örneğin, bir Ağaç hiçbir şey (Boş), Yaprak veya Düğüm içeremez.
data Tree = Empty
| Leaf Int
| Node Tree Tree
Bir Düğüm iki Ağaçtan oluştuğundan, cebirsel veri türleri özyinelemeli olabilir.
Örüntü eşleme, cebirsel veri türlerinin tür güvenliğini koruyacak şekilde yapısökülmesine olanak tanır . Aşağıdaki derinlik uygulamasını ve sözde kod eşdeğerini göz önünde bulundurun:
depth :: Tree -> Int
depth Empty = 0
depth (Leaf n) = 1
depth (Node l r) = 1 + max (depth l) (depth r)
nazaran:
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)
Bunun dezavantajı, programcının Boş bir ağaçta alan1'e erişilmemesi için Yapraktan önce Boş yazması gerektiğini hatırlaması gerekir. Benzer şekilde, Leaf durumunun Leaf2'de field2 öğesine erişilmemesi için Node durumundan önce bildirilmesi gerekir. Böylece tip güvenliği bu nedenle dil tarafından korunmaz, aksine programcıya ek bilişsel yük getirir. Bu arada, bu örnekleri doğrudan wikipedia sayfalarından alıyorum.
Tabii ki, ördek yazarak bir dil şu şekilde yapabilir:
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
Bu nedenle cebirsel veri türleri OOP eşdeğerlerinden kesinlikle daha iyi olmayabilir, ancak yazılım oluştururken çalışmak için farklı bir gerilim seti sağlarlar.