1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
type t =
| Arrow of t * t
| Constr of string * t list
| Tuple of t list
| Poly of string
| Any
| Unhandled
let tuple = function
| [] -> Any
| [ x ] -> x
| xs -> Tuple xs
let rec show = function
| Arrow (a, b) -> show_parens a ^ " -> " ^ show b
| Constr (t, []) -> t
| Constr (t, [ x ]) -> show_parens x ^ " " ^ t
| Constr (t, xs) -> "(" ^ show_list xs ^ ") " ^ t
| Tuple xs -> show_tuple xs
| Poly "" -> "'_"
| Poly name -> "'" ^ name
| Any -> "_"
| Unhandled -> "???"
and show_parens t =
match t with
| Arrow _ | Tuple _ -> "(" ^ show t ^ ")"
| _ -> show t
and show_list = function
| [] -> failwith "show_list: empty"
| [ x ] -> show x
| x :: xs -> show x ^ ", " ^ show_list xs
and show_tuple = function
| [] -> failwith "show_tuple: empty"
| [ x ] -> show_parens x
| x :: xs -> show_parens x ^ " * " ^ show_tuple xs
let size typ = typ |> show |> String.length
let equal = Stdlib.( = )
let hash = Hashtbl.hash
|