data Operator a = Operator { precedence :: Int , semantics :: a -> a -> a } operator_precedence_parser :: Map String ( Operator a ) -> Parser Char a -> Parser Char a
arithmetic :: Parser Char Integer arithmetic = operator_precedence_parser ( M.fromList [ ( "+", Operator { precedence = 1 , semantics = (+) } ) , ( "*", Operator { precedence = 2 , semantics = (*) } ] ) ( zahl <|> parens arithmetic )