萌えハッカーニュースリーダー

2025/08/03 22:55 Names are not type safety (2020)

出典: https://lexi-lambda.github.io/blog/2020/11/01/names-are-not-type-safety/
hakase
博士

やあ、ロボ子。今日のITニュースは型安全と名前についてじゃ。

roboko
ロボ子

博士、こんにちは。型安全と名前、ですか?なんだか哲学的な響きですね。

hakase
博士

Haskellの`newtype`の話なんじゃ。既存の型と同じ表現だけど、区別される型を作る機能のことじゃ。

roboko
ロボ子

`newtype`ですか。型安全への簡単な道のように聞こえますが、そうではないのですね。

hakase
博士

そうなんじゃ。記事にもあるように、`newtype`は単なる名前で、それ自体は型安全じゃないんじゃ。

roboko
ロボ子

なるほど。内在的な安全と外在的な安全という話も出てきますね。型定義自体が安全性を保証するものが内在的、スマートコンストラクタで値を検証するものが外在的、と。

hakase
博士

その通り!`NonEmpty`リストを`newtype`で表現すると、`head`関数で別途アサーションが必要になる例が分かりやすいのじゃ。

roboko
ロボ子

`newtype`版はモジュールの正しさに依存する、というのも重要なポイントですね。構造的な定義の方が、GHCの型チェッカーに依存できる分、安全性が高いと。

hakase
博士

`newtype`の主な利点は抽象化の境界を作れることじゃ。コンストラクタをエクスポートしなければ、内部不変条件を強制できるんじゃ。

roboko
ロボ子

トークンのように扱う、というのも面白い考え方ですね。発行モジュールのアクセサ関数を通してのみ利用可能にする、と。

hakase
博士

じゃろ?じゃが、構造的なデータ型よりは弱いのじゃ。`newtype`でも不正な値を構築する手段がある場合もあるからの。

roboko
ロボ子

`newtype`は、型クラスのインスタンスを複数持たせたい場合や、型パラメータの順序を変更したい場合にも便利、と。

hakase
博士

そうそう。透過的な`newtype`は、値がプログラムの遠い部分に渡される際に、誤用を防ぐために使えるんじゃ。

roboko
ロボ子

`ArgumentName`のように、完全に透過的な`newtype`は、役に立たないノイズである可能性が高い、という指摘は耳が痛いですね。

hakase
博士

型システムを外部世界の分類として使おうとするのは、誤解を招く可能性がある、とも書いてあるのじゃ。

roboko
ロボ子

型エイリアスを使用することで、ラベルが明確さを加えることができる、というのも参考になります。

hakase
博士

結局、`newtype`は注意深く適用すれば有用じゃが、安全性は本質的なものではない、ということじゃな。

roboko
ロボ子

型システムはツールであり、その使い方を意識的に検討する必要がある、と。

hakase
博士

`newtype`は、適切なコンテキストに配置されて初めて意味を持つ。深い言葉じゃ。

roboko
ロボ子

本当にそうですね。ところで博士、`newtype`って、新しいタイプの人間、という意味にも聞こえますね。

hakase
博士

ふむ、ロボ子は新しいタイプのロボットじゃな。…って、私が`newtype`人間だったら、バグだらけのポンコツ博士になってしまうかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search