Haskell プログラミング言語には次のような概念がありnewtypes
ます。 と書くnewtype Foo = Foo (Bar)
と、 に同型の新しい型Foo
が作成されBar
ます。つまり、2 つの間に全単射変換があります。このコンストラクトのプロパティは次のとおりです。
- 2 つの型は完全に分離されています (つまり、コンパイラは、明示的な変換を使用しないと、一方が必要な場所で他方を使用することを許可しません)。
- それらは同じ表現を共有します。特に、変換関数は実行時のコストがゼロで、ヒープ上で「同じオブジェクト」を返します。
- 変換はそのような型間でのみ可能であり、誤用することはできません。つまり、型の安全性は維持されます。
この機能を提供する他のプログラミング言語は?
1 つの例は、レコード アクセサー/コンストラクターのみで使用される C の単一値構造体のようです。無効な候補は、C の単一値構造体 (キャストはコンパイラによってチェックされないため)、または Java の単一メンバーを持つオブジェクト (これらは同じ表現を共有しないため) で使用される場合です。
関連する質問: F# には Haskell の「newtype」がありますか? (いいえ) そしてD には 'newtype' がありますか? (もう違います)。