2012-10-27 148 views
2

我是OCaml中的新成员。我写了这个代码,以减少代数表达式:OCaml递归函数

type expr = 
    | Int of int 
    | Float of float 
    | Add of expr*expr 
    | Sub of expr*expr 
    | Mult of expr*expr 
    | Div of expr*expr 
    | Minus of expr 

let rec eval expression = match expression with 
    | Add (e1, e2) -> (eval e1) +. (eval e2) 
    | Sub (e1,e2) -> (eval e1) -. (eval e2) 
    | Mult (e1,e2) -> (eval e1) *. (eval e2) 
    | Div (e1, e2) -> (eval e1) /. (eval e2) 
    | Minus (e1) -> -.(eval e1) 
    | Int i -> (float) i 
    | Float f -> f 

let rec simplify_expr e = match e with 
| Add (e1,e2) -> if (eval e1) == 0.0 then simplify_expr e2 
            else if (eval e2) == 0.0 then simplify_expr e1 
            else Add (simplify_expr e1, simplify_expr e2) 
| Mult(e1,e2) -> if (eval e1) == 1.0 then simplify_expr e2 
            else if (eval e2) == 1.0 then simplify_expr e1 
            else Mult (simplify_expr e1, simplify_expr e2) 
| Sub (e1, e2) -> if (eval e1) == 0.0 then simplify_expr e2 
            else if (eval e2) == 0.0 then simplify_expr e1 
            else Sub (simplify_expr e1, simplify_expr e2) 
| Div (e1, e2) -> if (eval e1) == 1.0 then simplify_expr e2 
            else if (eval e2) == 1.0 then simplify_expr e1 
            else Div (simplify_expr e1, simplify_expr e2) 
| Int i -> e 
| Minus e1 -> simplify_expr(e1) 
| Float f -> e 

我打电话simplify_expr这样:

Expr.simplify_expr Expr.Mult (Expr.Int 4, Expr.Add (Expr.Int 1, Expr.Int 0));; 

而且我已经得到了错误的答案:

- : Expr.expr = Expr.Mult (Expr.Int 4, Expr.Add (Expr.Int 1, Expr.Int 0)) 

下面我粘贴调用堆栈。

Expr.simplify_expr <-- 
    Expr.Mult (Expr.Int 4, Expr.Add (Expr.Int 1, Expr.Int 0)) 
Expr.eval <-- Expr.Int 4 
Expr.eval --> 4. 
Expr.eval <-- Expr.Add (Expr.Int 1, Expr.Int 0) 
Expr.eval <-- Expr.Int 0 
Expr.eval --> 0. 
Expr.eval <-- Expr.Int 1 
Expr.eval --> 1. 
Expr.eval --> 1. 
Expr.simplify_expr <-- Expr.Add (Expr.Int 1, Expr.Int 0) 
Expr.eval <-- Expr.Int 1 
Expr.eval --> 1. 
Expr.eval <-- Expr.Int 0 
Expr.eval --> 0. 
Expr.simplify_expr <-- Expr.Int 0 
Expr.simplify_expr --> Expr.Int 0 
Expr.simplify_expr <-- Expr.Int 1 
Expr.simplify_expr --> Expr.Int 1 
Expr.simplify_expr --> Expr.Add (Expr.Int 1, Expr.Int 0) 
Expr.simplify_expr <-- Expr.Int 4 
Expr.simplify_expr --> Expr.Int 4 
Expr.simplify_expr --> 
    Expr.Mult (Expr.Int 4, Expr.Add (Expr.Int 1, Expr.Int 0)) 
- : Expr.expr = Expr.Mult (Expr.Int 4, Expr.Add (Expr.Int 1, Expr.Int 0)) 

我不知道,为什么EVAL与1(9号线)simplify_expr返回后,调用添加。任何人都可以帮忙?

回答