Я должен написать функцию, которая принимает дамп это выражениюсоответствие шаблона возвращает строковое представление математического выражения
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). Как я могу это исправить? (без вложенных сопоставления с образцом, который не является хорошей идеей)
Что-то не так с упаковкой 'dump' с' pretty_dump', которая вызывает 'dump' и разделяет внешние parens? – delnan
@delnan: Это все равно даст «1 + (2 + (3 + 4)))« 'для' Add (Int 1, Add (Int 2, Add (Int 3, Int 4))) ', пока я предполагаю он хочет «1 + 2 + 3 + 4». – sepp2k