sig
  type t =
      Unit
    | Bool
    | Float
    | Char
    | String
    | Int of int option
    | Enum of Type.t
    | Tuple of Type.t list
    | Dict of (string * [ `RO | `RW ] * Type.t) list
    | Sum of (string * Type.t list) list
    | Option of Type.t
    | Rec of string * Type.t
    | Var of string
    | Arrow of Type.t * Type.t
    | Ext of string * Type.t
  val is_mutable : Type.t -> bool
  val free_vars : Type.t -> string list
  val foreigns : Type.t -> string list
  val unroll : (string * Type.t) list -> Type.t -> Type.t
  val is_subtype_of : Type.t -> Type.t -> bool
  val ( <: ) : Type.t -> Type.t -> bool
  val string_of_last_type_error : unit -> string
  val to_string : Type.t -> string
  exception Parse_error of string
  val of_string : string -> Type.t
end