devo scrivere una discarica funzione che prende un'espressionepattern-matching restituendo una stringa che rappresenta un'espressione matematica
type expression =
| Int of int
| Float of float
| Add of expression * expression
| Sub of expression * expression
| Mult of expression * expression
| Div of expression * expression
;;
e restituisce una rappresentazione di stringa di esso. Per esempio:
dump (Add (Int 1, Int 2));;
dump (Mult (Int 5, Add(Int 2, Int 3)), Int 1)
dovrebbe restituire qualcosa rispettivamente
- : string = "1+2"
- : string = "5*(2+3)-1"
ho scritto in questo modo:
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)
;;
e restituito le espressioni sono corretti, ma ancora non ottimale. (per Aggiungi (Int 1, Int 2)) è (1 + 2) e dovrebbe essere 1 + 2). Come posso risolvere questo? (corrispondenza senza nidificato di modello che non è una buona idea)
Qualcosa non va con il wrapping del 'dump' con un' pretty_dump' che chiama 'dump' e rimuove i parens esterni? – delnan
@delnan: Ciò restituisce comunque '" 1 + (2 + (3 + 4)) "' per 'Aggiungi (Int 1, Aggiungi (Int 2, Aggiungi (Int 3, Int 4))) mentre presumo vuole '" 1 + 2 + 3 + 4 "'. – sepp2k