简化表达F#

时间:2010-08-16 20:12:31

标签: f# pattern-matching

我希望表达式(x-x)简化为0。

type aexpr = 
| CstI of int
| Var of string
| Add of aexpr * aexpr
| Sub of aexpr * aexpr
| Mul of aexpr * aexpr;;

let rec simplify expr =
match expr with
| Add(CstI(n1), CstI(n2)) ->CstI(n1 + n2)
| Sub(CstI(n1), CstI(n2)) ->CstI(n1 - n2)
| Mul(CstI(n1), CstI(n2)) ->CstI(n1 * n2)
| Add(e, CstI(0)) -> simplify e
| Add(CstI(0), e) -> simplify e
| Sub(CstI(0), e) -> simplify e
| Sub(e, CstI(0)) -> simplify e
| Sub(Var(x1), Var(x2)) when x1.Equals(x2) -> CstI(0) // <- not working
| Mul(CstI(0), e) -> CstI(0)
| Mul(e, CstI(0)) -> CstI(0)
| Mul(CstI(1), e) -> simplify e
| Mul(e, CstI(1)) -> simplify e
| _ -> expr;;

这不行。我不明白我做错了什么。希望你能帮助我:)。

修改 它编译得很好,但它没有做任何事情。即

let e = Mul(CstI(1), Add(CstI(4), Sub(Var("x"), Var("x"))));;

在f#interactive中:

let result = simplify e;;
val result : aexpr = Add (CstI 4,Sub (Var "x",Var "x"))

结果应为CstI 4

2 个答案:

答案 0 :(得分:6)

simplify (Sub (Var "x", Var "x"))效果很好。您的示例不起作用的原因是simplify不遍历整个树,因此树的Sub (Var "x", Var "x")部分永远不会被简化。

简而言之,您错过了一个案例Sub (e,e) -> Sub (simplify e, simplify e),而其他运营商也是如此。

答案 1 :(得分:0)

这似乎在这里工作。您没有处理字符串比较的区分大小写问题,是吗?