Problem ist wirklich in unendlicher Rekursion. Ihr ast
Parser ruft zuerst operation
Parser auf. Aber dann ruft operation
Parser ast
wieder zurück. Und so weiter. <*>
Operator zum Parsen läuft auch Parser. Erklärung des Unterschieds von <|>
in sehr informellen Art und Weise: <*>
läuft Parser in Reihenfolge nacheinander, ob <|>
ersten Parser läuft und nur, wenn es fehlschlägt, läuft Sekunde.
operation = Operation <$> ast <*> operator <*> ast
ast = operation <|> number <|> identifier
Grundsätzlich, auch mit Umsortieren Parser Ihre Arbeitsweise wird nicht funktionieren. Finden Sie diese Antwort auf ähnliche Frage zur Erklärung: Megaparsec: Not able to parse arithmetic string