대수 데이터 유형은 여러 유형의 "사물"로 구성 될 수 있다는 점에서 구별됩니다. 예를 들어 Tree는 아무것도 포함하지 않거나 (Empty), Leaf 또는 Node를 포함 할 수 있습니다.
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)
이것은 프로그래머가 Leaf1 전에 Empty를 비워서 field1이 빈 트리에서 액세스되지 않도록해야한다는 단점이 있습니다. 마찬가지로 Leaf 케이스는 Leaf에서 노드 2에 액세스 할 수 없도록 노드 케이스보다 먼저 선언해야합니다. 따라서 타입 안전은 언어에 의해 유지되지 않고 오히려 프로그래머에게 추가적인인지 부하를 부과합니다. 그건 그렇고, 나는 Wikipedia 페이지에서 직접 예제를 가져옵니다.
물론 오리를 입력하는 랑게 쥬는 다음과 같이 할 수 있습니다.
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와 동등하지 않을 수도 있지만 소프트웨어를 구성 할 때 다른 장력을 제공합니다.