module type SCHLANGE = sig type 'a t exception SchlangeEmpty val isempty : 'a t -> bool val push : 'a -> 'a t -> 'a t val pop : 'a t -> 'a t val top : 'a t -> 'a (** raises StackEmpty when applied to empty stack *) val top_pop : 'a t -> 'a * 'a t val empty : 'a t end module Schlange : SCHLANGE = struct type 'a t = 'a list exception SchlangeEmpty let isempty s = s = [] let top_pop s = match s with [] -> raise SchlangeEmpty | h::t -> (h,t) let top s = let h,_ = top_pop s in h let pop s = let _,t = top_pop s in t let push x s = s @ [x] let empty = [] end