代数データ型
Algebraic Data Types(ADT) プログラム内でデータを表現し、その型の構造を安全かつ明確に記述するための概念
集合論 や 代数学 の考え方を元にしており、型を組み合わせる という観点でデータを構造化する 直積型: 複数の要素をまとめて持つ
code:latex
A×B={(a,b)∣a∈A,b∈B}
e.g.
code:hs
data User = User { name :: String, age :: Int }
name と age がセットになったデータ型
code:rs
struct User {
name: String,
age: u32,
}
直和型: 複数の選択肢のうち 1 つを持つ
code:latex
A+B={Left(a)∣a∈A}∪{Right(b)∣b∈B}
カーディナリティ は構成要素のカーディナリティの和
e.g.
Haskell
code:hs
data PaymentMethod = CreditCard String | PayPal String | Cash
Rust
code:rs
enum PaymentMethod {
CreditCard(String),
PayPal(String),
Cash
}
代数データ型では、これらを組み合わせることで、多用な構造を表現することができる
e.g.
Haskell
code:hs
data Shape = Circle Float | Rectangle Float Float
Rust
code:rs
enum Shape {
Circle { radius: f64 },
Rectangle { width: f64, height: f64 }
}
メリット
明確性: データの構造がコードから理解しやすい
拡張性: 新しいケースを追加しやすい