Сопоставление с образцом, возвращающее строковое представление математического выражения

Мне нужно написать дамп функции, который принимает выражение

type expression = 
| Int of int
| Float of float
| Add of expression * expression
| Sub of expression * expression
| Mult of expression * expression
| Div of expression * expression
;;

и возвращает его строковое представление. Например:

dump (Add (Int 1, Int 2));;
dump (Mult (Int 5, Add(Int 2, Int 3)), Int 1)

должен возвращать соответственно

- : string = "1+2"
- : string = "5*(2+3)-1"

Я написал что-то вроде этого:

let rec dump e = match e with
    | Int a -> string_of_int a
    | Float a -> string_of_float a
    | Add (e1,e2) -> "(" ^ (dump e1) ^ "+" ^ (dump e2) ^ ")"
    | Sub (e1,e2) -> "(" ^ (dump e1) ^ "-" ^ (dump e2) ^ ")"
    | Mult (e1,e2) -> (dump e1) ^ "*" ^ (dump e2)
    | Div (e1,e2) -> (dump e1) ^ "/" ^ (dump e2)
;;

и возвращенные выражения верны, но все же не оптимальны. (для Add (Int 1, Int 2)) это (1 + 2) и должно быть 1 + 2). Как я могу это исправить? (без сопоставления вложенных шаблонов, что не очень хорошая идея)

6
задан marooou 9 November 2010 в 14:37
поделиться