ならしコストによるキュー
30分プログラム、その715。ならしコストによるキューを作ってみる。
基本的にならしコストによるQueueを実装した - みずぴー日記の焼直しです。むしろ、いくつかの関数の実装をさぼってます。
あと、いまさらながらhttp://www.mpi-sws.org/~rossberg/sml-vs-ocaml.htmlが便利なことに気付きました。SMLの文法がコンパクトにまとまっているので、サクっと調べれます。
使い方
fun example () = let val q = enqueue "foo" (enqueue "bar" (enqueue "baz" empty)) val (v1,q1) = dequeue q val (v2,q2) = dequeue q1 val (v3,q3) = dequeue q2 in println v1; println v2; println v3 end;
ソースコード
type 'a queue = { front: 'a list, back : 'a list } val empty : 'a queue = { front=[], back=[] }; fun isEmpty q = q = empty fun balance (q as {front=front, back=back}) = case front of [] => {front=List.rev back, back=[]} | _ => q; fun enqueue v (q : 'a queue) = balance { front = #front q, back = v :: (#back q) }; fun dequeue (q : 'a queue) = case #front q of x::xs => (x,balance { front = xs, back = #back q }) | [] => raise Empty; fun println s = (print s; print "\n"); fun example () = let val q = enqueue "foo" (enqueue "bar" (enqueue "baz" empty)) val (v1,q1) = dequeue q val (v2,q2) = dequeue q1 val (v3,q3) = dequeue q2 in println v1; println v2; println v3 end;