レコードとレコード型

それぞれのフィールド名をプログラマが決定できるという点を除けば、 レコードはタプルと良く似ています。 同様にレコード型もタプル型と良く似ています。 例えばレコード型 point2D は以下のように定義できます。

typedef point2D = @{ x= double, y= double }

xy はこの型のレコード値における2つのフィールドの名前です。 またレコードのフィールドのことを要素と呼ぶことがあります。 特殊な記号である @{ はその型が フラット/ネイティブ/アンボックス化 レコードであることを表わします。 型 point2D の値は次のように theOrigin という名前で生成することができます。

val theOrigin = @{ x= 0.0, y= 0.0 } : point2D

レコードから要素を選択するために一般的なドット表記を使うことができます。 次のようなコードになります。

val theOrigin_x = theOrigin.x and theOrigin_y = theOrigin.y

あるいは要素の選択にパターンマッチを使うこともできます。 これは次のようなコードになります。

val @{ x= theOrigin_x, y= theOrigin_y } = theOrigin

この例では theOrigin_xtheOrigin_y の名前はそれぞれ、theOrigin の中にある xy という名前の要素に束縛されています。 もし要素全てではなく一部を選択したい場合には、次のようなパターンマッチを使うことができます。

val @{ x= theOrigin_x, ... } = theOrigin // the x-component only val @{ y= theOrigin_y, ... } = theOrigin // the y-component only

もしもこの文法に混乱するようであれば、ドット表記を使うことをおすすめします。 レコード値のパターンマッチは私自身あまり使いません。

ネイティブ/フラット/アンボックス化 レコードと比較してボックス化レコードを扱うのに必要なことは、 特殊記号を代えるだけです。 つまり @{'{ に代えるだけです。