我希望表达式(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
答案 0 :(得分:6)
simplify (Sub (Var "x", Var "x"))
效果很好。您的示例不起作用的原因是simplify
不遍历整个树,因此树的Sub (Var "x", Var "x")
部分永远不会被简化。
简而言之,您错过了一个案例Sub (e,e) -> Sub (simplify e, simplify e)
,而其他运营商也是如此。
答案 1 :(得分:0)
这似乎在这里工作。您没有处理字符串比较的区分大小写问题,是吗?