type expr = Const of int | Add of expr * expr | Mul of expr * expr let rec eval : expr -> int = fun (e : expr) => match e with | Const(i) => i | Add(u,v) => plus (eval u) (eval v) | Mul(u,v) => times (eval u) (eval v) end type binop = Add' | Mul' type expr' = Const' of int | BinOp' of binop * expr' * expr' let rec convert : expr' -> expr = fun (e : expr') => match e with | Const'(i) => Const(i) | BinOp'(op,u,v) => match op with | Add' => Add(convert u,convert v) | Mul' => Mul(convert u,convert v) end end let ornament convert : expr' -> expr let rec eval' : expr' -> int = fun (e : expr') => match e with | Const'(i) => i | BinOp'(op,u,v) => match op with | Add' => plus (eval' u) (eval' v) | Mul' => times (eval' u) (eval' v) end end