SMLの参照型変数の宣言、値の参照及び更新


Standard ML(以下SML)における参照型の利用方法(宣言、値の参照、更新)を記します。

はじめに

実行環境はUbuntu18.04.5 LTSで、バージョン等は以下の通りです。
$ sml
Standard ML of New Jersey v110.79 [built: Tue Aug 8 23:21:20 2017]

記法等を示す際のメタ変数は[メタ変数名]で示します。
例えば、変数の宣言は、次のように書きます。

val [変数名] = [値]

特に示さない限り、例示を行う場合は上記のsmlコマンドを行った時の入出力を示します。

本記事は私の学習内容をまとめること及びその内容の発信を目的としており、内容の正確性は保証いたしかねますが、間違いの指摘等のコメントは歓迎します。

対象読者

SMLを使用して簡単なプログラミングを行ったことがある方を対象とします。変数の宣言、型、関数についてある程度理解していることを前提とします。

参照型の利用方法

基本

参照型とは、値への参照を示す型のことです。参照型を利用することにより、手続き的な処理を容易に行うことが可能となります。

宣言方法

参照型を宣言するときは、次のように書きます。

val [変数名] = ref [値]

以下に参照型を宣言する具体例を示します。

- val x = ref 1;
val x = ref 1 : int ref
- val s = ref "qiita";
val s = ref "qiita" : string ref

変数xはint型の値1への参照を示し、変数sはstring型の値"qiita"への参照を示します。これらは、int ref型や、string ref型というように表記されます。一般に、t型の値への参照をする型はt ref型となります。考え方はC言語におけるポインタと同様です。

値の参照方法

参照型の変数が示す値を参照するには、次のように書きます。1

![変数名]

以下に具体例を示します。

- val x = ref 5;
val x = ref 5 : int ref
- !x;
val it = 5 : int
- Int.toString (!x + 10);
val it = "15" : string

変数xはint ref型であるため、!xはint型の式です。上の例の場合、3行目以降で!xと書くことと5と書くことは同義です。

値の更新

参照型変数が示す値を更新するには、次のように書きます。

[変数名] := [値]

以下に具体例を示します。

- val x = ref 1; 
val x = ref 1 : int ref
- x := 3;
val it = () : unit
- x := !x * 10;
val it = () : unit
- !x;
val it = 30 : int

変数xをint型の値1への参照として宣言し、次に値を3に更新しています。更新前の値は!により参照できるため、5行目のようにxが参照する値を10倍するといった操作も可能です。最終的に、xが参照している値は30に更新されます。

まとめ

参照型変数の宣言、参照型変数が示す値の参照及び値の更新について記しました。参照型は値が更新されることを前提とした型で、C言語等の手続き型言語の変数と似た方法で使用できます。使用した記法は以下の通りです。

宣言
val [変数名] = ref [値]

値の参照
![変数名]

値の更新
[変数名] := [値]

参考文献2

大堀淳,『プログラミング言語Standard ML入門』,共立出版,2001


  1. 厳密には、「!」は(t ref->t)の関数として定義されているので、上記は変数[変数名]を関数!に適用していることになります。ここで、tは任意の型を示すものとします。そのため、!と[変数名]の間に空白が存在しても同様に参照できます。 

  2. 参考文献は、次の形式で示しています。著者名,『書籍名』,出版,初版発行年