OCaml: Übereinstimmungsausdruck in einem anderen?

Ich arbeite gerade an einem kleinen Projekt mit OCaml. ein einfacher mathematischer Ausdrucksvereinfacher. Ich soll bestimmte Muster in einem Ausdruck finden und vereinfachen, damit die Anzahl der Klammern im Ausdruck abnimmt. Bisher konnte ich die meisten Regeln implementieren, mit Ausnahme von zwei, für die ich beschlossen habe, eine rekursive, musterabgleichende "Filter" -Funktion zu erstellen. Die zwei Regeln, die ich implementieren muss, sind:

- Wandle alle Ausdrücke der Form a - (b + c) oder ähnlich in a - b - c @

-Umwandle alle Ausdrücke der Form a / (b * c) oder ähnlich in a / b / c

... was ich für ziemlich einfach halte, und wenn es mir gelungen ist, eines zu implementieren, kann ich das andere problemlos implementieren. Ich habe jedoch Probleme mit der Funktion für die rekursive Mustererkennung. Mein Typ-Ausdruck lautet wie folgt:

type expr =
 | Var of string            (* variable *)
 | Sum of expr * expr       (* sum  *)
 | Diff of expr * expr      (* difference *)
 | Prod of expr * expr      (* product *)
 | Quot of expr * expr      (* quotient *)
;;

Und worauf ich hauptsächlich Probleme habe, liegt im Match-Ausdruck. Zum Beispiel versuche ich so etwas:

let rec filter exp =   
    match exp with       
    | Var v -> Var v                        
    | Sum(e1, e2) -> Sum(e1, e2)          
    | Prod(e1, e2) -> Prod(e1, e2)
    | Diff(e1, e2) ->
        match e2 with
        | Sum(e3, e4) -> filter (diffRule e2)
        | Diff(e3, e4) -> filter (diffRule e2)      
        | _ -> filter e2         
    | Quot(e1, e2) ->                                 ***this line***
        match e2 with  
        | Quot(e3, e4) -> filter (quotRule e2)        
        | Prod(e3, e4) -> filter (quotRule e2)        
        | _ -> filter e2
;;

Es scheint jedoch, dass der Übereinstimmungsausdruck in der markierten Zeile als Teil der vorherigen "inneren Übereinstimmung" anstelle der "Hauptübereinstimmung" erkannt wird, sodass alle "Anführungszeichen (...)" - Ausdrücke niemals erkannt werden. Ist es überhaupt möglich, Übereinstimmungsausdrücke in anderen Übereinstimmungsausdrücken wie diesen zu verwenden? Und was wäre der richtige Weg, um das innere Match zu beenden, damit ich mit den anderen Möglichkeiten weitermachen kann?

Ignore die Logik, da es ziemlich genau das ist, was ich zuerst erfunden habe, ist es nur, dass ich nicht in der Lage war, es zu versuchen, da ich mich zuerst mit diesem "Match" -Fehler befassen muss, obwohl jede Empfehlung, wie mit der Rekursivität umzugehen ist oder die Logik wäre willkommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage