abstype 'a Queue = Q of 'a list * 'a list with exception E ; val empty = Q([],[]) ; fun null( Q([],[]) ) = true | null _ = false ; fun enq x ( Q([],_) ) = Q( [x] , [] ) | enq x ( Q(front,back) ) = Q( front , x::back ) ; fun deq( Q(_::[],back) ) = Q( rev back , [] ) | deq( Q(_::rest,back) ) = Q( rest , back ) | deq( _ ) = empty ; fun hd( Q(head::rest,_) ) = head | hd( Q([],_) ) = raise E ; end ; fun buildq F = foldl ( fn( f , q ) => f q ) empty F ; val q = buildq [enq 0, enq 1, enq 2, enq 3 ] ; datatype 'a instruction = create of 'a Queue -> 'a Queue | observe of 'a Queue -> 'a ; fun process obs [] q = obs | process obs ( (create f)::ins ) q = process obs ins ( f q ) | process obs ( (observe f)::ins ) q = process ( (f q)::obs handle E => [] ) ins q ; process [] [observe hd, observe hd, create deq, observe hd,observe hd,create deq] q ; process [] [ create(enq 4), create(enq 5), create(enq 6) , create deq , observe hd] q ;