Ich habe viele Methoden, die in ihrer Definition einen Standardcode haben, siehe obiges Beispiel.Musterabgleich in einer Haskell-Funktion
replace:: Term -> Term -> Formula -> Formula
replace x y (Not f) = Not $ replace x y f
replace x y (And f g) = And (replace x y f) (replace x y g)
replace x y (Or f g) = Or (replace x y f) (replace x y g)
replace x y (Biimp f g) = Biimp (replace x y f) (replace x y g)
replace x y (Imp f g) = Imp (replace x y f) (replace x y g)
replace x y (Forall z f) = Forall z (replace x y f)
replace x y (Exists z f) = Exists z (replace x y f)
replace x y (Pred idx ts) = Pred idx (replace_ x y ts)
Wie Sie sehen können, folgt die Definitionen für replace
Funktion ein Muster. Ich möchte das gleiche Verhalten der Funktion haben, seine Definition zu vereinfachen, wahrscheinlich einige Musteranpassung verwendet wird, vielleicht mit einem Platzhalter _
oder X
über die Argumente, so etwas wie:
replace x y (X f g) = X (replace x y f) (replace x y g)
Zur Vermeidung folgende Definitionen:
replace x y (And f g) = And (replace x y f) (replace x y g)
replace x y (Or f g) = Or (replace x y f) (replace x y g)
replace x y (Biimp f g) = Biimp (replace x y f) (replace x y g)
replace x y (Imp f g) = Imp (replace x y f) (replace x y g)
Gibt es einen Weg? Vergiss den Zweck der Funktion, es könnte was auch immer sein.
Vielleicht 'DeriveFunctor' oder eine explizite Instanz davon machen? Dann könnte das obige wie folgt lauten: Ersetzen Sie xy = fmap (\ z -> wenn x == z dann y else x) '. Das bedeutet natürlich, dass 'Formula' eine Art' * -> * 'hat, aber das klingt vernünftig. 'Formula Bool' wäre eine boolesche Formel. – Alec
Sie könnten 'Formel' eine Instanz von [' Compos'] machen (https://hackage.haskell.org/package/uniplate-1.6.12/docs/Data-Generics-Compos.html), würde das helfen? – Cactus