structure ILModule = struct type variable = Variable.variable datatype kind = Ktype | Ksing of con | Kpi of variable * kind * kind | Ksigma of variable * kind * kind | Kunit and con = Cvar of variable | Clam of variable * kind * con | Capp of con * con | Cpair of con * con | Cpi1 of con | Cpi2 of con | Cunit | Carrow of con * con | Cprod of con list | Csum of con list | Crec of variable * con | Ctag of con | Cref of con | Cexn | Cbool | Cint | Cchar | Cstring datatype name = HIDE | VAL of string | CON of string | MOD of string | DT of string | DCON datatype sg = Sval of con | Scon of kind | Ssigma of variable * sg * sg | Spi of variable * sg * sg | Sunit | Snamed of name * sg datatype term = Tvar of variable | Tlam of variable * con * term | Tapp of term * term | Ttuple of term list | Tproj of term * int | Tinj of term * int * con | Tcase of term * (variable * term) list | Troll of term * con | Tunroll of term | Ttag of term * term | Tiftag of term * term * variable * term * term | Tnewtag of con | Traise of term * con | Thandle of term * variable * term | Tref of term | Tderef of term | Tassign of term * term | Tbool of bool | Tif of term * term * term | Tint of int | Tchar of char | Tstring of string | Tlet of variable * term * term | Tletm of variable * variable * module * term * con | Tsnd of module | Tprim of Prim.prim * term list and module = Mvar of variable | Mval of term | Mcon of con | Munit | Mpair of variable * variable * module * module | Mpi1 of module | Mpi2 of module | Mlam of variable * variable * sg * module | Mapp of module * module | Min of name * module | Mout of module | Mlet of variable * variable * module * module * sg | Mletd of variable * variable * module * module | Mseal of module * sg end