K
type Operator =
| Oper of (Expr -> Expr)
| Oper2 of (Expr -> Expr -> Expr)
and Expr =
| Exprs of Expr * Operator * Expr
| Expr of Operator * Expr
| Num of int
type Operator with =
member this.Invoke expr1 expr2 =
match this with
| Oper(x) -> x expr1
| Oper2(x) -> x expr1 (Option.get expr2)
let rec int expr =
match expr with
| Num(x) -> x
| Expr(op, x) -> int <| op.Invoke x None
| Exprs(x, op, y) -> int <| op.Invoke x (Some(y))