17

Haskell プログラミング言語には次のような概念がありnewtypesます。 と書くnewtype Foo = Foo (Bar)と、 に同型の新しい型Fooが作成されBarます。つまり、2 つの間に全単射変換があります。このコンストラクトのプロパティは次のとおりです。

  • 2 つの型は完全に分離されています (つまり、コンパイラは、明示的な変換を使用しないと、一方が必要な場所で他方を使用することを許可しません)。
  • それらは同じ表現を共有します。特に、変換関数は実行時のコストがゼロで、ヒープ上で「同じオブジェクト」を返します。
  • 変換はそのような型間でのみ可能であり、誤用することはできません。つまり、型の安全性は維持されます。

この機能を提供する他のプログラミング言語は?

1 つの例は、レコード アクセサー/コンストラクターのみで使用される C の単一値構造体のようです。無効な候補は、C の単一値構造体 (キャストはコンパイラによってチェックされないため)、または Java の単一メンバーを持つオブジェクト (これらは同じ表現を共有しないため) で使用される場合です。

関連する質問: F# には Haskell の「newtype」がありますか? (いいえ) そしてD には 'newtype' がありますか? (もう違います)。

4

5 に答える 5

8

Scala の値クラスはこれらの条件を満たしていると思います。

例えば:

case class Kelvin(k: Double) extends AnyVal

編集:実際には、すべての場合に変換のオーバーヘッドがゼロになるかどうかはわかりません。このドキュメントでは、ヒープ上のオブジェクトの割り当てが必要ないくつかのケースについて説明しているため、そのようなケースでは、オブジェクトから基になる値にアクセスする際に実行時のオーバーヘッドが発生すると想定しています。

于 2013-07-11T10:55:20.313 に答える