Pour écrire une version plus efficace, il faudrait connaître la réprésentation des piles.
piles.ml
module Pre_Pile =
  struct
    type 'a pile = 'a list ref
    let créer() = ref []
    let ajouter x p = p := x :: !p
    exception Vide
    let retirer p = 
      match !p with
      | [] -> raise Vide
      | x::t -> p:= t; x
  end;;

module type PILE =
  sig
    type 'a pile
    val créer : unit -> 'a pile
    exception Vide
    val ajouter : 'a -> 'a pile -> unit
    val retirer : 'a pile -> 'a
  end;;

module Pile = (Pre_Pile : PILE);;

module type CPILE =
  sig
    include PILE
    val consulter : 'a pile -> 'a
  end

module Cpile : CPILE = struct
  open Pre_Pile
  type 'a pile = 'a Pre_Pile.pile
  let créer = créer
  exception Vide = Vide
  let ajouter = ajouter
  let retirer = retirer
  let consulter p =
    match !p with
    | [] -> raise Vide
    | x::t -> x
end;;