【ファントムがた】

ファントム型 とは?

最終更新:
💡 データを増やさず、型で単位や状態を区別する

実行時の値として保持しない型パラメータを、コンパイル時の区別や制約に使う仕組み。単位や状態の異なる値を混同しにくくする。

📌 このページのポイント
ファントム型:単位を混同しない例 型の検査 保持する値 Length<Mm> 単位を型で区別 Length<Inch> 違う単位は別の型 数値はf64 PhantomDataは 大きさ0のマーカー 同じUnitだけを足せるAddなら Mm + Inchは型不一致 入力値や換算の正しさは別に確認する
RustのLength<Unit>(f64, PhantomData<Unit>)を簡略化した例。型で表した組み合わせを検査し、値を読み取る実行時の検証とは役割が異なる。
ひよこ ひよこ
ファントム型って、幽霊みたいな型なの?
ペンギン先生 ペンギン先生
実行時の値として保持しない型パラメータを、型の区別に使うんだ。RustならPhantomDataというマーカーで、その型が関係していることをコンパイラへ伝えられるよ。型パラメータの値を保存するための容量は増えないんだ
ひよこ ひよこ
データに現れないのに、何のために使うの?
ペンギン先生 ペンギン先生
たとえばLength<Mm>とLength<Inch>で、ミリメートルとインチの長さを区別できるよ。中の数値はどちらもf64でも、型が違えば、同じ単位だけを足すように設計できるんだ。図はRust公式の単位の例を簡略化しているよ
ひよこ ひよこ
単位が違うまま足すとどうなるの?
ペンギン先生 ペンギン先生
同じUnit同士だけを足せるAddの実装なら、Length<Mm>とLength<Inch>の直接の加算は型不一致になるよ。ただし型を付ける前に入力した数値や、単位を換算する計算が正しいかは別の確認が必要なんだ
ひよこ ひよこ
認証済みかどうかも型で分けられる?
ペンギン先生 ペンギン先生
状態を型で区別し、許した状態にだけ操作を提供する設計もできるよ。ただし型を付けただけでは、外部から来たトークンが本当に有効かは分からない。認証結果を確かめてから型付きの値を作るなど、実行時の検証との境目を設計する必要があるね
ひよこ ひよこ
型パラメータを書けば、どの言語でも区別される?
ペンギン先生 ペンギン先生
言語の型の仕組みで変わるよ。TypeScriptでは、メンバーの型に使われない型パラメータだけでは構造が同じになり、区別できないことがある。RustのPhantomDataと同じ書き方や保証だと思い込まず、型が実際に制約へ効くか確認しよう
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ファントム型」って出てきたら「値を増やさず型で単位や状態を区別する仕掛け」と思えばだいたいOK!
📖 おまけ:英語の意味
「Phantom Type」 = 幽霊型
💬 Phantomは幽霊。実行時の値としては現れない型パラメータが、型の検査では役に立つ、というイメージだよ

参考資料

← 用語集にもどる