Упростить выражение F # - PullRequest
2 голосов
/ 17 августа 2010

Я хочу, чтобы выражение (х-х) было упрощено до 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;;

Это не делает этого. Я не вижу, что я делаю неправильно. Надеюсь, вы можете помочь мне:)

Edit: Он хорошо компилируется, но ничего не делает. Т.е..

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

В f # интерактив:

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

Результат должен быть CstI 4

Ответы [ 2 ]

6 голосов
/ 17 августа 2010

simplify (Sub (Var "x", Var "x")) работает просто отлично. Причина, по которой ваш пример не работает, заключается в том, что simplify не пересекает все дерево, поэтому часть дерева Sub (Var "x", Var "x") никогда не упрощается.

Короче говоря, вы пропускаете регистр Sub (e,e) -> Sub (simplify e, simplify e) и то же самое для других операторов.

0 голосов
/ 17 августа 2010

Кажется, здесь работает.Вы не имеете дело с проблемой чувствительности к регистру при сравнении строк?

...