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

代数的データ型 とは?

💡 「かけ算」と「たし算」でどんなデータ構造も作れる型の代数学。
📌 このページのポイント
代数的データ型(Algebraic Data Type) 直積型(Product Type) = かけ算(AND) User { name: String, age: Int } 名前 AND 年齢 → 両方必須 直和型(Sum Type) = たし算(OR) Result { Ok(T) | Err(E) } 成功 OR 失敗 → どちらか1つ 組み合わせで複雑な型を表現 Rust enum / Haskell data / Scala sealed trait パターンマッチングと組み合わせて安全なコードに
直積型(AND)と直和型(OR)を組み合わせてデータを表現する
ひよこ ひよこ

代数的データ型って、数学の代数と関係あるの?

ペンギン先生 ペンギン先生

実はあるんだ。型を「かけ算(AND)」と「たし算(OR)」で組み合わせるという発想が代数の演算と対応しているからそう呼ばれているよ。

ひよこ ひよこ

かけ算の型って何なの?

ペンギン先生 ペンギン先生

直積型(Product Type)というんだ。複数のフィールドを「AND」でまとめた型だよ。たとえば「名前と年齢の両方を持つUser型」がそれにあたる。Rustの struct や、多くの言語のクラスがこれにあたるよ。

ひよこ ひよこ

じゃあたし算の型は?

ペンギン先生 ペンギン先生

直和型(Sum Type)といって、「どれか1つ」を表す型だよ。たとえば「成功か失敗のどちらか」を表す Result 型がそれだね。Rustの enum が典型例で、`Ok(値)` か `Err(エラー)` のどちらかの状態しか持てないんだ。

ひよこ ひよこ

それって null チェックと何が違うの?

ペンギン先生 ペンギン先生

直和型はコンパイラが「すべての候補を処理したか」を確認してくれるんだ。パターンマッチングと組み合わせると、Err を処理し忘れたらコンパイルエラーになるから、null を忘れて実行時クラッシュするリスクがなくなるよ。

ひよこ ひよこ

HaskellRust 以外の言語でも使えるの?

ペンギン先生 ペンギン先生

Scalaの sealed trait+case class、TypeScriptのUnion型、Swiftのenum with associated valuesなどが近い概念だよ。関数型言語の影響を受けた言語では広く採用されている考え方なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「代数的データ型」って出てきたら「ANDとORで型を組み立てる仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Algebraic Data Type」 = 代数的データ型
💬 algebra(代数)は「足し算・かけ算などの演算」のこと。型の組み合わせ方がまさに代数の演算と対応しているから、こう呼ばれているんだよ。
← 用語集にもどる