型宣言
Q# では、ユーザー定義型がサポートされます。 ユーザー定義型は、F# のレコード型に似ています。これらは変更できませんが、copy-and-update コンストラクトをサポートしています。
ユーザー定義データ型
ユーザー定義型には、名前付き項目と匿名項目の両方を含めることができます。
たとえば、名前空間内の次の宣言では、2 つの名前付き項目 Real
と Imaginary
(どちらも Complex
型) を持つ Double
型が定義されています。
newtype Complex = (Real: Double, Imaginary : Double);
名前付き項目と名前のない項目の任意の組み合わせがサポートされ、内側の項目にも名前を付けることができます。
たとえば、Nested
型は次のように定義されます。
newtype Nested = (Double, (ItemName : Int, String));
これには、Double
型と String
型の 2 つの匿名項目と、Int
型の名前付き項目 ItemName
が含まれます。
含まれている項目には、名前または "分解" によってアクセスできます (詳細については、項目へのアクセスに関するページを参照してください)。 また、ラップ解除演算子を使用して、宣言で定義されているものと形状が一致するすべての項目のタプルにアクセスすることもできます。
ユーザー定義型は 2 つの理由で役立ちます。 まず、定義された型を使用するライブラリとプログラムが、分解ではなくそれらの名前を使用して項目にアクセスする限り、ライブラリ コードを壊さずに、後で追加の項目を格納するようにその型を拡張できます。 この理由から、分解による項目へのアクセスは、一般的に推奨されません。
次に、Q# では、特定のデータ型に対する意図と期待を伝えることができます。これは、項目の型が同じであっても、2 つのユーザー定義型の値の間の自動変換が存在しないためです。
ユーザー定義コンストラクター
ユーザー定義型のコンストラクターは、コンパイラによって自動的に生成されます。 現時点では、カスタム コンストラクターを定義することはできませんが、これは将来言語に追加される可能性があります。