プログラミング言語 Standard ML 入門 (問題の解答例)
10.2 モジュールのシグネチャの指定
問 10.5
FastIntQueue に 不透明な QUEUE シグネチャ制約を加えたストラクチャAbsFastIntQueueを定義し, AbsIntQueue と置き換え可能であることを確かめよ.
解答例 AbsIntQueueを使用する以下のようなコードを考える。
signature QUEUE = sig exception EmptyQueue type queue val newQueue : unit -> queue val enqueue : int*queue -> unit val dequeue : queue -> int end structure AbsIntQueue = IntQueue :> QUEUE; structure Q = AbsIntQueue; val q = Q.newQueue(); val _ = Q.enqueue(1, q); val _ = Q.enqueue(2, q); val _ = Q.enqueue(3, q); val a = Q.dequeue q; val b = Q.dequeue q; val c = Q.dequeue q;
SML#での実行結果は、以下の通りである。
# structure AbsIntQueue = struct type queue <hidden> exception EmptyQueue = IntQueue.EmptyQueue val newQueue = fn : unit -> queue val enqueue = fn : int * queue -> unit val dequeue = fn : queue -> int end # structure Q = struct type queue <hidden> exception EmptyQueue = IntQueue.EmptyQueue val newQueue = fn : unit -> queue val enqueue = fn : int * queue -> unit val dequeue = fn : queue -> int end # val q = _ : AbsIntQueue.queue # val a = 1 : int # val b = 2 : int # val c = 3 : int
AbsIntQueueをAbsFastIntQueueに置き換えたコードは以下の通りである。
structure AbsFastIntQueue = FastIntQueue :> QUEUE; structure Q = AbsFastIntQueue; val q = Q.newQueue(); val _ = Q.enqueue(1, q); val _ = Q.enqueue(2, q); val _ = Q.enqueue(3, q); val a = Q.dequeue q; val b = Q.dequeue q; val c = Q.dequeue q;
SML#での実行結果は、以下の通りである。
# structure AbsFastIntQueue = struct type queue <hidden> exception EmptyQueue = FastIntQueue.EmptyQueue val newQueue = fn : unit -> queue val enqueue = fn : int * queue -> unit val dequeue = fn : queue -> int end # structure Q = struct type queue <hidden> exception EmptyQueue = FastIntQueue.EmptyQueue val newQueue = fn : unit -> queue val enqueue = fn : int * queue -> unit val dequeue = fn : queue -> int end # val q = _ : AbsFastIntQueue.queue # val a = 1 : int # val b = 2 : int # val c = 3 : int