【だいすうてきデータがた】

代数的データ型 とは?

最終更新:
💡 「両方そろえる」と「どれかを選ぶ」で、データの形を組み立てる

直積型(複数のフィールドをまとめる型)と直和型(複数の候補から1つを選ぶ型)を組み合わせて複雑なデータ構造を表現する型システムの仕組み。

📌 このページのポイント
データを「両方」と「どれか」で表す 直積型:AND 直和型:OR User 名前 年齢 両方そろえる Result Ok(成功の値) Err(エラー) どちらか1つ 候補の中にも複数の要素を持てる matchの網羅性検査で処理漏れを防ぐ すべての実行時エラーをなくすわけではない
左は名前と年齢の組、右は成功か失敗の候補。青は組のフィールド、緑・赤はResultの二つの候補で、両方を同時に選ぶ意味ではない。網羅性の検査方法は言語による。
ひよこ ひよこ
代数的データ型って、数学の代数と関係あるの?
ペンギン先生 ペンギン先生
型を「かけ算(AND)」と「たし算(OR)」で組み合わせる発想だよ。たとえば色が2種類、サイズが3種類なら、両方を持つ組み合わせは2×3=6通り。このように値の組み合わせから考えると分かりやすいね。
ひよこ ひよこ
かけ算の型って何なの?
ペンギン先生 ペンギン先生
直積型(Product Type)というんだ。複数の要素を両方そろえる型だよ。たとえば名前と年齢を持つUser型や、座標のxとyの組がそれにあたる。Rustではstructやタプルで表現できるね。
ひよこ ひよこ
じゃあたし算の型は?
ペンギン先生 ペンギン先生
直和型(Sum Type)は、区別できる候補のどれか1つを表すよ。RustのResultなら、成功のOk(値)か失敗のErr(エラー)のどちらかなんだ。候補の中に複数の要素を持たせれば、直和と直積を組み合わせられるよ。
ひよこ ひよこ
それって null チェックと何が違うの?
ペンギン先生 ペンギン先生
RustのOptionならSome(値)とNoneで、値があるかないかを型に表せるよ。matchは全候補を覆う必要があるので、Noneなどの処理漏れをコンパイラが検出する。ただし型を使えばすべての実行時エラーがなくなるわけではなく、失敗時に何をするかは設計が必要なんだ。
ひよこ ひよこ
Haskell や Rust 以外の言語でも使えるの?
ペンギン先生 ペンギン先生
ほかの言語でも同様の形を表せるよ。TypeScriptでは、kindなどのタグを持つオブジェクトのユニオンで候補を区別できる。neverへの代入を使った網羅性検査もあるんだ。候補の表し方や、処理漏れを検出する条件は言語ごとに確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「代数的データ型」って出てきたら「ANDとORで型を組み立てる仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Algebraic Data Type」 = 代数的データ型
💬 直積をかけ算、直和をたし算として捉える呼び名だよ。有限個の値を持つ要素なら、組み合わせの数が積や和で数えられるね

参考資料

← 用語集にもどる