sig
  type id = string
  type field = string
  type exp =
      Int of int
    | Add of HOF_sugar.exp * HOF_sugar.exp
    | Sub of HOF_sugar.exp * HOF_sugar.exp
    | Mul of HOF_sugar.exp * HOF_sugar.exp
    | Let of HOF_sugar.id * HOF_sugar.exp * HOF_sugar.exp
    | Id of HOF_sugar.id
    | If0 of HOF_sugar.exp * HOF_sugar.exp * HOF_sugar.exp
    | Lambda of HOF_sugar.id list * HOF_sugar.exp
    | Apply of HOF_sugar.exp * HOF_sugar.exp list
    | Record of (HOF_sugar.field * HOF_sugar.exp) list
    | SetField of HOF_sugar.exp * HOF_sugar.field * HOF_sugar.exp
    | GetField of HOF_sugar.exp * HOF_sugar.field
    | True
    | False
    | If of HOF_sugar.exp * HOF_sugar.exp * HOF_sugar.exp
    | And of HOF_sugar.exp * HOF_sugar.exp
    | Or of HOF_sugar.exp * HOF_sugar.exp
    | IntEq of HOF_sugar.exp * HOF_sugar.exp
    | Empty
    | Cons of HOF_sugar.exp * HOF_sugar.exp
    | Head of HOF_sugar.exp
    | Tail of HOF_sugar.exp
    | IsEmpty of HOF_sugar.exp
end