let rec pure_type fmt = function
  | PTint -> fprintf fmt "int"
  | PTbool -> fprintf fmt "bool"
  | PTunit -> fprintf fmt "unit"
  | PTreal -> fprintf fmt "real"
  | PTexternal([],id) -> fprintf fmt "%s" id
  | PTvar s -> fprintf fmt "'%s" s
  | PTexternal([t],id) ->
      fprintf fmt "%a %s" pure_type t id
  | PTexternal(l,id) -> fprintf fmt "(%a) %s"
      (print_list space pure_type) l id