TL;DR

直和型と直積型を組み合わせてデータを表す型。主に関数型プログラミングで使われ、データの構造を型として安全かつ明確に記述できる。

なぜ必要か

データの構造を型で表すと、不正な値が入りにくくなり、不変条件を型で守れる。また、データの構造がコードから読み取りやすくなり、新しいケースも追加しやすい。

仕組み

集合論や代数学の考え方を元に、型を組み合わせてデータを構造化する。これが「代数的」と呼ばれる理由である。基本となる構成要素は直積型と直和型の 2 つである。

直積型は複数の要素をまとめて持つ。取りうる値の数は構成要素の値の数の積になる。

A×B={(a,b)∣a∈A,b∈B}

直和型は複数の選択肢のうち 1 つを持つ。取りうる値の数は構成要素の値の数の和になる。

A+B={Left(a)∣a∈A}∪{Right(b)∣b∈B}

この 2 つを組み合わせることで、多様な構造を表現できる。

例

Haskell と Rust で、直積型、直和型、その組み合わせを書くと次のようになる。

-- 直積型: name と age がセットになったデータ型
data User = User { name :: String, age :: Int }
 
-- 直和型
data PaymentMethod = CreditCard String | PayPal String | Cash
 
-- 組み合わせ
data Shape = Circle Float | Rectangle Float Float
// 直積型
struct User {
    name: String,
    age: u32,
}
 
// 直和型
enum PaymentMethod {
    CreditCard(String),
    PayPal(String),
    Cash,
}
 
// 組み合わせ
enum Shape {
    Circle { radius: f64 },
    Rectangle { width: f64, height: f64 },
}

関連